繁体   English   中英

SQLAlchemy,PostgreSQL:查询具有数组中特定项的行

[英]SQLAlchemy, PostgreSQL: Query for rows with a specific item in an array

我试图根据数组中存在的整数变量使用SQLALchemy ORM对象过滤PostgreSQL记录,但我找不到正确的方法。

数据库设置

我有一个带有整数数组的 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)

使用ANY关键字在PostgreSQL中查询表格中包含partners数组中包含数字2的行:

my_db=> SELECT * FROM test_arr WHERE 2 = ANY(partners);
 id | partners
----+----------
 12 | {1,2,3}
 13 | {2,3,4}
(2 rows)

ORM与SQLAlchemy

SQLAlchemy 支持PostgreSQL数组 ,该表由以下表示:

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

问题

如何运行SELECT * FROM test_arr WHERE 2 = ANY(partners); 使用Pythonic对象?

我试过了什么

我尝试过使用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)

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

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

@>数组运算符

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM