3

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

城市 州 address_line_1 邮政编码 phone_numbers

都是 text[] 类型

    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

您需要使用and_()andor_()方法,或者使用&&and||运算符,而不是 Pythonandor关键字。

此外,您使用数组索引和“<@”执行的操作更容易执行(在 0.8 中),如下所示:

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

阵列

于 2012-12-23T17:53:13.230 回答
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

于 2013-01-21T04:16:32.533 回答
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()
于 2014-02-27T21:36:29.697 回答