我在使用sqlalchemy进行的查询与将我直接将其直接写入某些查询工具(例如用于SQLite的数据库浏览器(ubuntu))时遇到了一些奇怪的区别。
我有一个包含6列以上的表格,并想查询与某些过滤器匹配的3列。使用sqlalchemy ORM查询,我得到了零行,但是在数据库浏览器中执行它得到了预期的结果。我打印sqlalchemy编译的SQL查询,复制并粘贴到数据库浏览器中,结果相同(在python中为零,在数据库浏览器中为正确的结果)
因此,为了快速解决问题,我查询了整个表(仅3列),并像声明一样使用if id in query_result
来检查表是否存在并提取相关数据。到目前为止,该方法仍然有效,但是效率低下。
我尝试了这些变体:
# Attempt A
query_result = session.query(Table.id, Table.column_a, Table.column_b). \
filter(Table.id.in_(1, 2, 3)).all()
# SELECT Table.id, Table.column_a, Table.column.b
# FROM Table WHERE Table.id IN (1, 2, 3)
# Attempt B
ids_to_search = (1, 2, 3)
query_result = [session.query(Table.id, Table.column_a, Table.column_b). \
filter(Table.id == x).first() for x in ids_to_search]
# SELECT Table.id, Table.column_a, Table.column.b
# FROM Table WHERE Table.id = :x
但始终返回None
如果我在DBite for SQLite中执行它,则上面注释的查询将返回预期的行。
我正在使用的修复程序是:
query_result = session.query(Table.id, Table.column_a, Table.column_b). \
all()
for id_to_search in (1, 2, 3):
for column_id, column_a, column_b in query_result:
if column_id == id_to_search:
do_some_stuff()
这给出了预期的结果。
环境有: