19

次のように、sqlalchemy のクエリで単純なフィルター操作を実行しようとしています。

q = session.query(Genotypes).filter(Genotypes.rsid.in_(inall))

どこ

inall は文字列のリストです Genotypes はテーブルにマッピングされます: class Genotypes(object): pass

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です)

4

2 に答える 2

22

sを取得しているテーブルがrsid同じデータベースで利用可能な場合、Python コードで 100 万個のエントリを渡すのではなく、サブクエリを使用してそれらをクエリに渡します。Genotypes

sq = session.query(RSID_Source).subquery()
q = session.query(Genotypes).filter(Genotypes.rsid.in_(sq))

問題は、そのリストを SQLite (または実際には任意のデータベース) に渡すために、SQLAlchemy がin句の各エントリを変数として渡す必要があることです。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 */)
于 2013-04-23T00:30:29.307 に答える