【发布时间】:2016-01-04 16:02:02
【问题描述】:
我正在尝试根据数组中是否存在整数变量来使用 SQLALchemy ORM 对象过滤 PostgreSQL 记录,但我找不到正确的方法。
数据库设置
我有一个带有 array of integers 的 PostgreSQL 表:
my_db=> \d test_arr;
Table "public.test_arr"
Column | Type | Modifiers
----------+-----------+-------------------------------------------------------
id | integer | not null default nextval('test_arr_id_seq'::regclass)
partners | integer[] |
该表包含一些值:
my_db=> SELECT * FROM test_arr;
id | partners
----+----------
12 | {1,2,3}
13 | {2,3,4}
14 | {3,4,5}
15 | {4,5,6}
(4 rows)
在 PostgreSQL 中使用 ANY 关键字在 partners 数组中查询包含数字 2 的行:
my_db=> SELECT * FROM test_arr WHERE 2 = ANY(partners);
id | partners
----+----------
12 | {1,2,3}
13 | {2,3,4}
(2 rows)
带有 SQLAlchemy 的 ORM
SQLAlchemysupports PostgreSQL arrays,表表示为:
class TestArr(Base):
__tablename__ = 'test_arr'
# override schema elements like Columns
id = Column('id', Integer, Sequence('test_arr_id_seq'), primary_key=True)
partners = Column(ARRAY(Integer))
def __init__(self, partners):
self.partners = partners
def __str__(self):
return '<%d for %s>' % (self.id, str(self.partners))
问题
如何使用 Pythonic 对象运行 SELECT * FROM test_arr WHERE 2 = ANY(partners); 的等效项?
我尝试了什么
我尝试过使用func,如下所示:
print session.query(TestArr).filter(func.any(TestArr.partners, 2)).all()
但因语法错误而失败:
sqlalchemy.exc.ProgrammingError: (ProgrammingError) syntax error at or near "ANY"
LINE 3: WHERE ANY(test_arr.partners, 332)
【问题讨论】:
标签: python arrays postgresql orm sqlalchemy