sqlalchemy中的查询与直接sqlite之间的区别

时间:2018-09-09 18:17:14

标签: python sqlalchemy

我在使用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()

这给出了预期的结果。

环境有:

  • python 3.6.6
  • sqlalchemy 1.2.2
  • sqlite3 2.6.0

0 个答案:

没有答案