Python SQLAlchemy过滤器输入\运算符
我尝试在sqlalchemy中对查询执行一个简单的筛选操作,如下所示:Python SQLAlchemy过滤器输入\运算符,python,sqlite,sqlalchemy,Python,Sqlite,Sqlalchemy,我尝试在sqlalchemy中对查询执行一个简单的筛选操作,如下所示: q = session.query(Genotypes).filter(Genotypes.rsid.in_(inall)) 在哪里 inall是字符串列表 基因型映射到一个表: 类别基因型(对象): 通过 Genotypes.mapper = mapper(Genotypes, kg_table, properties={'rsid': getattr(kg_table.c, 'rs#')}) 这对我来说似乎很简单,但
q = session.query(Genotypes).filter(Genotypes.rsid.in_(inall))
在哪里
inall是字符串列表
基因型映射到一个表:
类别基因型(对象):
通过
Genotypes.mapper = mapper(Genotypes, kg_table, properties={'rsid': getattr(kg_table.c, 'rs#')})
这对我来说似乎很简单,但是当我通过执行q.first()
执行上述查询时,我得到了以下错误:
“sqlalchemy.exc.OperationalError:(OperationalError)SQL太多
变量u'SELECT“后面是inall中1M项的列表
列表但它们不应该是SQL变量,而应该是一个
成员资格是筛选标准
我是否做了错误的过滤
(数据库是sqlite)如果从中获取
rsid
s的表在同一数据库中可用,我将使用a将它们传递到基因型查询中,而不是在Python代码中传递一百万个条目
sq = session.query(RSID_Source).subquery()
q = session.query(Genotypes).filter(Genotypes.rsid.in_(sq))
问题是,为了将该列表传递给SQLite(实际上是任何数据库),SQLAlchemy必须将
子句中的的每个条目作为变量传递。SQL大致可以翻译为:
-- Not valid SQLite SQL
DECLARE @Param1 TEXT;
SET @Param1 = ?;
DECLARE @Param2 TEXT;
SET @Param2 = ?;
-- snip 999,998 more
SELECT field1, field2, -- etc.
FROM Genotypes G
WHERE G.rsid IN (@Param1, @Param2, /* snip */)
以下变通方法对我有效:
q = session.query(Genotypes).filter(Genotypes.rsid.in_(inall))
query_as_string = str(q.statement.compile(compile_kwargs={"literal_binds": True}))
session.execute(query_as_string).first()
这基本上迫使查询在执行之前编译为字符串,从而绕过了整个变量问题。SQLAlchemy的文档中提供了有关这方面的一些详细信息
顺便说一句,若您不使用SQLite,您可以使用任意运算符将list对象作为单个参数传递(请参阅我对这个问题的回答)。为什么不在进行查询之前将其内联?对于我来说,这没有意义,为什么上面的内容不能仅仅是IN(values…
而不是SET@params=values。。。在(@params…
)中,我尝试了子查询,但未能使它们正常工作。最后的.subquery()
似乎起到了很大的作用。谢天谢地的暗示还是安全?