当前位置: 首页 > 面试题库 >

使用Postgres和SQLAlchemy使用Array列进行过滤

东门楚
2023-03-14
问题内容

我有一个带有int
[]列的简单表,我希望能够选择其数组元素中的任何一个与我具有的值匹配的行,并且我无法弄清楚如何仅使用SQLAlchemy来做到这一点原始查询,我不想这样做。

这是表的架构(“ testuser”):

 Column  |          Type          |
---------+------------------------+
 id      | integer                |
 name    | character varying(250) |
 numbers | integer[]              |

样本数据如下所示:

 id |  name   |    numbers
----+---------+---------------
  1 | David   | {25,33,42,55}
  2 | Salazar | {11,33,7,19}
  3 | Belinda | {32,6,20,23}
  4 | Casey   | {19,20,27,8}
  5 | Kathie  | {25,31,10,40}
  6 | Dianne  | {25,20,40,39}
  7 | Cortez  | {1,20,18,38}

这是一条生成我想要的SQL语句;我想在Python中完成所有这些工作,而不必简​​单地编写原始查询(仅以25为例)。

scrape=# select * from testuser where 25 = ANY(numbers);
 id |  name  |    numbers
----+--------+---------------
  5 | Kathie | {25,31,10,40}
  6 | Dianne | {25,20,40,39}
  1 | David  | {25,33,42,55}
(3 rows)

我发现写它的另一种方式:

scrape=# select * from testuser where numbers @> ARRAY[25];
 id |  name  |    numbers
----+--------+---------------
  5 | Kathie | {25,31,10,40}
  6 | Dianne | {25,20,40,39}
  1 | David  | {25,33,42,55}
(3 rows)

这是我用来生成表的Python代码:

from sqlalchemy import Column, Integer, String
from sqlalchemy.dialects import postgresql
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker

Base = declarative_base()

class TestUser(Base):
    __tablename__ = 'testuser'
    id = Column(Integer, primary_key=True)
    name = Column(String(250))
    numbers = Column(postgresql.ARRAY(Integer))

engine = create_engine('postgresql://postgres:{pw}@localhost:5432/scrape'.format(pw=POSTGRES_PASSWORD))

Base.metadata.create_all(engine)

DBSession = sessionmaker(bind=engine)
session = DBSession()

testcases = [{"numbers": [25, 33, 42, 55], "name": "David"}, {"numbers": [11, 33, 7, 19 ], "name":     "Salazar"}, {"numbers": [32, 6, 20, 23 ], "name": "Belinda"}, {"numbers": [19, 20, 27, 8 ], "name": "Casey"},     {"numbers": [25, 31, 10, 40 ], "name": "Kathie"}, {"numbers": [25, 20, 40, 39 ], "name": "Dianne"},     {"numbers": [1, 20, 18, 38 ], "name": "Cortez"} ]

for t in testcases:
    session.add(TestUser(name=t['name'], numbers=t['numbers']))
session.commit()

问题答案:

因此,您想使用Postgres Array
Comparator

query = session.query(TestUser).filter(TestUser.numbers.contains([some_int])).all()

要么

query = session.query(TestUser).filter(TestUser.numbers.any(25)).all()


 类似资料:
  • 我正在使用DataTables,并将这个有点尴尬的Javascript拼凑在一起,以允许行和列高亮显示。它基于本页的示例(http://datatables.net/release-datatables/examples/api/highlight.html ). 下面是dataTable配置的相关部分: 服务器上的模板代码插入了一些常量。这是列数。以下是DataTables调试输出:http:/

  • 问题内容: 我想知道是否可以在SQLAlchemy中生成一个语句而无需使用显式地请求它。如果我使用: 然后它会生成如下内容: 这在使用InnoDB的MySQL中要慢得多。我正在寻找一种不需要表具有已知主键的解决方案,如使用SQLAlchemy获取表中的行数中所建议。 问题答案: 我设法在两层上使用SQLAlchemy呈现以下SELECT。 SQL表达式层的用法 来自ORM层的用法 您只需将其子类化

  • 问题内容: 假设我有一个列表(或集合): 我想返回一个ImmutableList(Set),它以自然顺序对术语进行排序/分组,其中以“ src”开头的术语排在第一位,“ assoc”第二位,而“ dest”排在最后。如果一个术语不包含这些术语,则应将其从结果列表中删除。 因此,这里的结果是“ srcB”,“ srcT”,“ assocX”,“ destA”。 我想我可以通过Iterables.fi

  • 数据库表是一个二维表,包含多行多列。把一个表的内容用Python的数据结构表示出来的话,可以用一个list表示多行,list的每一个元素是tuple,表示一行记录,比如,包含id和name的user表: [ ('1', 'Michael'), ('2', 'Bob'), ('3', 'Adam') ] Python的DB-API返回的数据结构就是像上面这样表示的。 但是用

  • 数据库表是一个二维表,包含多行多列。把一个表的内容用Python的数据结构表示出来的话,可以用一个list表示多行,list的每一个元素是tuple,表示一行记录,比如,包含id和name的user表: [ ('1', 'Michael'), ('2', 'Bob'), ('3', 'Adam') ] Python的DB-API返回的数据结构就是像上面这样表示的。 但是用

  • 问题内容: 说我有一个postgres表,如下所示: 我什至可以使用Spring Data插入列或?如果可能的话,它看起来如何作为存储库和实体?我还没有找到任何解决此问题的文档或示例,可能是因为它与更常见的用例重叠,并以一对多关系插入到多个表中。说到这,我完全打算使用Postgresql 数据类型,并且不使用任何关系表。 问题答案: 您需要创建自己的类型并实现。根据下一个响应,我编写了一个泛型,可

  • 问题内容: 我有一个定义以下类型的架构: 这样就创建了一个对象,如下所示: 现在,我尝试将另一个生成的JAXB对象添加到该有效负载中,如下所示: 但是我遇到了一个可怕的异常,看起来它将永远无法工作,所以我决定先将有效负载对象序列化为XML,然后将其作为字符串添加到有效负载中。 而且这会爆炸,并说“ java.lang.String”不包含@XmlRootElement。 那么xs:any的使用将如

  • 问题内容: 我正在使用psql在Postgres中查询数据库。我使用以下查询来搜索一个名为 tag 的字段,该字段的数据类型为文本数组: 现在,我需要创建一个查询,以在 标签 字段中搜索以字母“ A”开头的任何单词。我尝试了以下方法: 这给了我一个语法错误。关于如何将LIKE与文本数组结合使用的任何建议? 问题答案: 使用函数将数组转换为行集: 本应算唯一条目表,只需更换你的主键的名称。 话虽这么