如何在SQLAlchemy中编写它

时间:2012-12-21 18:18:50

标签: sqlalchemy

我需要在SQL Alchemy中编写一个查询来检查包含字符串数组(Postgre)的字段的一些字符串参数

城市 州 地址第一行 邮政编码 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)

关于如何做的任何想法?,

提前致谢!

3 个答案:

答案 0 :(得分:4)

您需要使用and_()or_()方法,或&&||运算符,而不是Python and和{{1}关键字。

此外,您使用数组索引和&#34;&lt; @&#34;进行的操作比较容易做到(在0.8中):

or

请参阅ARRAY

答案 1 :(得分:3)

使用SqlAlchemy 0.8,可以写成:

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

或者,有一个解散班:

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

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

答案 2 :(得分:2)

以下是我们如何在SQLAlchemy 0.9中使用它。

SQLAlchemy不知道如何在这些查询中将Python类型转换为数组元素类型。由于我们的数组元素为VARCHAR(256)而不是TEXT,因此我们必须在cast字面值中添加array表达式。

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()