4

PostgreSQLデータベースへの接続でPythonを使用する場合、SQLAlchemyを使用していますが、ORMは使用していません。列の1つが文字列の配列であるテーブルがあり、入力パラメーターが配列列に存在しないすべての行を取得したいとします。SQLAlchemyの他のクエリの結果を取得できるため、問題はクエリの作成にある必要があることに注意してください。

実装する必要のあるSQLは次のようになります。

select pk from table where 'paramstring' NOT IN(array_column);
-- returns several rows

Pythonで思いついた関数は次のようなものです。

def get_not_matching(param):

    select_statement = select([the_table.c.pk]).where(
        ~data_table.c.array_column.in_([param])
    )

    #... execute and retrieve ResultProxy
    # the result_set comes back empty

任意の提案をいただければ幸いです。

4

1 に答える 1

3

問題は、inステートメントを逆方向に使用していることです。これは、文字列を含むリストを含む行を検索するのではなく、リストにあるファイルを含む行を検索するために使用されます。

言い換えれば、あなたが持っているものは生成しています:

select pk from table where array_column NOT IN(paramstring);

https://groups.google.com/forum/?fromgroups=#!topic/sqlalchemy/QAfTDrNYaFIによると、SQLAlchemyはPostgres配列列のアイテムのクエリをまだサポートしていません。

彼らはあなたが望むものを達成するために生のフィルターを使用することを提案します:

select([the_table.c.pk]).where(text("array_column @> ARRAY[:element_value]"))).params(element_value='paramstring')
于 2012-10-22T20:37:34.680 に答える