Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python SQLAlchemy过滤器输入\运算符_Python_Sqlite_Sqlalchemy - Fatal编程技术网

Python 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#')}) 这对我来说似乎很简单,但

我尝试在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.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()
似乎起到了很大的作用。谢天谢地的暗示还是安全?