sql >> データベース >  >> RDS >> Mysql

SQLAlchemy WHERE IN単一値(生のSQL)

    いいえ、SQLパラメータはスカラーのみを処理します 値。ここでSQLを生成する必要があります。生のSQLが必要な場合は、以下を使用してください:

    statement = "SELECT * FROM table WHERE `key`='rating' AND uid IN ({})".format(
        ', '.join([':i{}'.format(i) for i in range(len(some_list))]))
    
    my_sess.execute(
            statement, 
            params={'i{}'.format(i): v for i, v in enumerate(some_list)})
        ).fetchall()
    

    例えば some_listのすべての値を保持するのに十分なパラメータを生成します 文字列フォーマットを使用して、一致するパラメータを生成してそれらを埋めます。

    さらに、 literal_column() オブジェクト すべての生成を行うには:

    from sqlalchemy.sql import literal_column
    
    uid_in = literal_column('uid').in_(some_list)
    statement = "SELECT * FROM able WHERE `key`='rating' AND {}".format(uid_in)
    
    my_sess.execute(
            statement, 
            params={'uid_{}'.format(i): v for i, v in enumerate(some_list)})
        ).fetchall()
    

    ただし、複数のデータベースダイアレクトのサポートがはるかに簡単になるため、`sqlalchemy.sql.expressionモジュールを使用してステートメント全体を生成することもできます。

    さらに、 uid_in オブジェクトは、バインドパラメータの正しい値への参照をすでに保持しています。 str.format()のように文字列に変換するのではなく、 上記のアクションでは、SQLAlchemyには実際のオブジェクトと関連するパラメーターが含まれ、 paramsを生成する必要がなくなります。 辞書どちらか

    以下が機能するはずです:

    from sqlalchemy.sql import table, literal_column, select
    
    tbl = table('table')
    key_clause = literal_column('key') == 'rating'
    uid_clause = literal_column('uid').in_(some_list)
    my_sess.execute(select('*', key_clause & uid_clause, [tbl]))
    

    ここで、sqlalchemy.sql。 select() 列の仕様を取得します(ここでは *にハードコードされています )、where句(の2つの句から生成されます SQL ANDを生成します 条項)および選択可能なもののリスト。ここにあなたのもの sqlalchemy.sql .table() 価値。

    クイックデモ:

    >>> from sqlalchemy.sql import table, literal_column, select
    >>> some_list = ['foo', 'bar']
    >>> tbl = table('table')
    >>> key_clause = literal_column('key') == 'rating'
    >>> uid_clause = literal_column('uid').in_(some_list)
    >>> print select('*', key_clause & uid_clause, [tbl])
    SELECT * 
    FROM "table" 
    WHERE key = :key_1 AND uid IN (:uid_1, :uid_2)
    

    ただし、これらすべてから生成された実際のオブジェクトツリーには、バインドパラメータの実際の値も含まれているため、 my_sess.execute() これらに直接アクセスできます。




    1. MySQLクエリエラー1054

    2. 複合インデックスの左端の列のワイルドカードは、インデックスの残りの列がインデックスルックアップ(MySQL)で使用されないことを意味しますか?

    3. SQLAlchemy + Postgres:マージ時に明示的な型キャストを追加する必要がある場合があります

    4. テーブルサイズはINSERTのパフォーマンスに影響しますか?