10

SQLAlchemy に次の形式のクエリを生成させる方法を見つけようとしています。

select * from t where (a,b) in ((a1,b1),(a2,b2));

これは可能ですか?

そうでない場合、それをエミュレートする方法に関する提案はありますか?

4

4 に答える 4

29

使用tuple_:

keys = [(a1, b1), (a2, b2)]
session.query(T).filter(tuple_(T.a, T.b).in_(keys)).all()

http://docs.sqlalchemy.org/en/latest/core/sqlelement.html#sqlalchemy.sql.expression.tuple_

于 2011-07-17T15:48:17.307 に答える
3

さて、上記の Hao Lian のおかげで、私は痛みを伴う場合でも機能的な解決策を思いつきました。

Clazz宣言型のマップされたクラス 、およびlist複合主キー値のタプルの があると仮定しvalues ます (より適切な (IMO) SQL 生成スタイルを使用するように編集されています)。

from sqlalchemy.sql.expression import text,bindparam
...
    def __gParams(self、f、vs、ts、bs):
        for j,v in enumerate(vs):
            キー = f % (j+97)
            bs.append(bindparam(key, value=v, type_=ts[j]))
            yield ':%s' % キー

    def __gRows(自己、ts、値、bs):
        for i,vs in enumerate(values):
            f = '%%c%d' % i
            yield '(%s)' % ', '.join(self.__gParams(f, vs, ts, bs))

    def __gKeys(自己、k、ts):
        k の c の場合:  
            ts.append(c.type)
            利回り str(c)

    def __makeSql(self,Clazz, values):
        t = []
        b = []
        リターンテキスト(
                '(%罪)' % (
                    ', '.join(self.__gKeys(Clazz.__table__.primary_key,t)),
                    ', '.join(self.__gRows(t,values,b))),
                bindparams=b)

このソリューションは、複合または単純な主キーに対して機能します。col.in_(keys)ただし、単純な主キーの場合よりもおそらくわずかに遅くなります。

これを行うためのより良い方法の提案にまだ興味がありますが、この方法は今のところ機能しており、or_(and_(conditions))方法または方法よりも著しく優れていfor key in keys: do_stuff(q.get(key))ます。

于 2009-06-04T16:25:35.730 に答える
2

SQLAlchemy 0.6のtuple_ コンストラクトを参照してください。

于 2010-04-01T21:51:20.820 に答える