3

文字列の配列を含むフィールドに対していくつかの文字列パラメーターをチェックするために、SQL Alchemy でクエリを作成する必要があります (Postgre)

市区町村 address_line_1 zip_code phone_numbers

すべてテキスト型 [] です

    select_statement = bdb.get_select_statement(business_schema)\
    .where(((text('array[:acity] <@ city')
            and text('array[:astate] <@ state')
            and text('array[:aaddress] <@ address_line_1'))
    or
           (text('array[:aaddress] <@ address_line_1') and text('array[:azip_code] <@ zip_code')))
    and  (text('array[:aphone] <@ phone_numbers')))\
    .params(aaddress = address_line_1, acity = city, astate = state, azip_code = zip_code, aphone = phone_number)

問題は、これを行うと「この句のブール値が定義されていません」という例外が発生することです。

記述されるプレーン SQL は次のとおりです。

select * from business where ('address_line1' = ANY (address_line_1) 
                              and 'acity' = ANY (city) 
                              and 'state' = ANY (state)
or
        ('adress_line1' = ANY (address_line_1) and 'zip' = ANY (zip_code))
and
'phone' = ANY (phone_numbers)

それを行う方法についてのアイデアはありますか?,

前もって感謝します!

4

3 に答える 3

4

Python andキーワードではなく、 and_()andor_()メソッド、または代わりに&&and演算子を使用する必要があります。||andor

また、配列のインデックス付けと "<@" で行っている操作は、次のように (0.8 で) 簡単に実行できます。

mytable.c.array[:"acity"].op('<@')(mytable.c.city)

ARRAYを参照してください。

于 2012-12-23T17:53:13.230 に答える
3

SqlAlchemy 0.8では、これは次のように書くことができます。

mytable.c.myarraycolumn.contains(['something'])

または、decrlativeクラスの場合:

query.filter(MyTable.myarraycolumn.contains(['something']))

http://docs.sqlalchemy.org/en/latest/dialects/postgresql.html#sqlalchemy.dialects.postgresql.ARRAY

于 2013-01-21T04:16:32.533 に答える
2

SQLAlchemy 0.9 でこれを機能させる方法を次に示します。

SQLAlchemy は、これらのクエリで Python 型を配列要素型に変換する方法を知りません。配列要素はVARCHAR(256)の代わりにあったため、リテラル内に式TEXTを追加する必要がありました。castarray

session.query.filter(
    models.TableClass.arraycolumn.contains(   
        # contains() generates @>, and @> always takes an array, 
        # it's more like has-subset
        array([
            # the array() literal constructor needs an iterable
            cast(
                'array-element-to-find', 
                # SQLAlchemy does not know how to convert a Python string 
                # to an SQL VARCHAR type here
                String(256),
            )
        ])
    )
).all()
于 2014-02-27T21:36:29.697 に答える