我需要在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)
关于如何做的任何想法?,
提前致谢!
答案 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()