我有一个SQLAlchemy查询对象,想要获取已编译的SQL语句的文本,并绑定其所有参数(例如,没有%s或其他变量等待语句编译器或MySQLdb方言引擎等绑定).
调用str()查询会显示如下内容:
SELECT id WHERE date_added <= %s AND date_added >= %s ORDER BY count DESC
Run Code Online (Sandbox Code Playgroud)
我试过查询query._params,但它是一个空的字典.我使用这个sqlalchemy.ext.compiler.compiles装饰器的例子编写了我自己的编译器,但即使是那里的语句仍然有%s我想要的数据.
我无法弄清楚何时混入我的参数来创建查询; 在检查查询对象时,它们总是一个空字典(尽管查询执行正常,引擎在打开echo日志时将其打印出来).
我开始得到SQLAlchemy不希望我知道底层查询的消息,因为它打破了表达式API接口所有不同DB-API的一般性质.我不介意在我发现它之前是否执行了查询; 我只是想知道!
我想问一下两者之间的区别
for row in session.Query(Model1):
pass
Run Code Online (Sandbox Code Playgroud)
和
for row in session.Query(Model1).all():
pass
Run Code Online (Sandbox Code Playgroud)
是第一个以某种方式用单个查询轰炸你的数据库的迭代器,而后者"急切地"将整个事件作为一个列表(如range(x)vs xrange(x))查询?
我目前正在玩SQLAlchemy,这真的很整洁.
为了测试,我创建了一个包含我的图片存档的大表,由SHA1哈希索引(删除重复:-)).这是令人印象深刻的快...
为了好玩,我select *在生成的SQLite数据库上做了相同的操作:
session = Session()
for p in session.query(Picture):
print(p)
Run Code Online (Sandbox Code Playgroud)
我希望看到哈希滚动,但它只是继续扫描磁盘.与此同时,内存使用率暴涨,几秒后达到1GB.这似乎来自SQLAlchemy的身份地图功能,我认为它只保留弱引用.
有人可以向我解释一下吗?我认为在写出哈希后会收集每个Picture p!?
我注意到SQLAlchemy缓慢获取(和ORMing)一些数据,使用裸骨SQL获取相当快.首先,我创建了一个包含一百万条记录的数据库:
mysql> use foo
mysql> describe Foo;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| A | int(11) | NO | | NULL | |
| B | int(11) | NO | | NULL | |
| C | int(11) | NO | | NULL | |
+-------+---------+------+-----+---------+-------+
mysql> SELECT COUNT(*) FROM Foo;
+----------+
| COUNT(*) |
+----------+
| 1000000 …Run Code Online (Sandbox Code Playgroud) 我需要从大表的所有行读取数据,但我不想一次将所有数据都拉入内存.是否有一个SQLAlchemy函数将处理分页?也就是说,将几行拉入内存,然后在必要时获取更多行.
我知道你可以这样做limit,offset正如本文所暗示的那样,但如果我不需要,我宁愿不处理.
我从互联网资源中读到,当偏移量增加时,查询会很慢.但就我而言,我觉得它太慢了.我在用postgres 9.3
这是查询(id是主键):
select * from test_table offset 3900000 limit 100;
Run Code Online (Sandbox Code Playgroud)
它返回我周围的数据10 seconds.我觉得它太慢了.我4 million在桌子上有记录.数据库的总体大小是23GB.
机器配置:
RAM: 12 GB
CPU: 2.30 GHz
Core: 10
Run Code Online (Sandbox Code Playgroud)
postgresql.conf我更改的文件中的几个值如下所示.其他人是默认的.
shared_buffers = 2048MB
temp_buffers = 512MB
work_mem = 1024MB
maintenance_work_mem = 256MB
dynamic_shared_memory_type = posix
default_statistics_target = 10000
autovacuum = on
enable_seqscan = off ## its not making any effect as I can see from Analyze doing seq-scan
Run Code Online (Sandbox Code Playgroud)
除了这些,我也通过改变的值试过random_page_cost = 2.0和cpu_index_tuple_cost = 0.0005 …