【问题标题】:SQLAlchemy, PostgreSQL: Query for rows with a specific item in an arraySQLAlchemy,PostgreSQL:查询数组中具有特定项目的行
【发布时间】: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


    【解决方案1】:

    你可以使用sqlalchemy.dialects.postgresql.Any

    from sqlalchemy.dialects.postgresql import Any
    session.query(TestArr).filter(Any(2, TestArr.partners)).all()
    

    @&gt;数组运算符

    session.query(TestArr).filter(TestArr.partners.op('@>')([2])).all()
    

    【讨论】:

    • 我最喜欢的语法是直接使用列表达式:session.query(TestArr).filter(TestArr.partners.any(2)).all()
    猜你喜欢
    • 2019-05-29
    • 1970-01-01
    • 2015-07-17
    • 1970-01-01
    • 2014-05-28
    • 2013-12-20
    • 2013-08-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多