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

SQLAlchemy:如何筛选PgArray列类型?

汪跃
2023-03-14
问题内容

在纯postgres中,我们可以编写:

SELECT * FROM my_table WHERE 10000 = ANY (array_field);

或者

SELECT * FROM my_table WHERE 10000 = ALL (array_field);

没有原始sql的情况下如何在sqlalchemy的帮助下进行相同的操作?


问题答案:

a = ANY(b_array)等于1。a IN(elements_of_b_array)

因此,您可以使用该in_()方法。

我不记得曾经使用a = ALL(b_array)PostgreSQL多年。你?

如果您要处理 数组列, 并想测试列中
是否包含给定元素(或给定数组的所有元素),则可以利用PostgreSQL数组运算符 @>contains)或更合适地利用反同级 <@is contained by)。

数组运算符的优点是可以通过数组列上的 GIN索引 来支持它们(与ANY构造不同)。

您的SQL语句:

SELECT * FROM my_table WHERE 10000 = ANY (array_field);

(几乎)等于1

SELECT * FROM my_table WHERE 10000 <@ array_field;

我不是SQLAlchemy的专家,但是根据SQLAlchemy手册中的教程,您可以使用任何运算符:

如果遇到确实不可用的运算符,则可以始终使用该 op() 方法。这将生成您需要的任何运算符:

>>> print users.c.name.op('tiddlywinks')('foo') users.name tiddlywinks

:name_1

大胆强调我的。您的语句在SQLA中可能如下所示:

s = select([my_table], array_field.op('@>')('ARRAY[10000]'))

或使用PostgreSQL数组值的替代输入语法:

s = select([my_table], array_field.op('@>') (cast('{10000}', int[])))

1与NULL处理有一个细微的区别:

SELECT '{NULL}'::int[] <@ ... -- that's an array with a single NULL element

总是屈服FALSE

SELECT NULL IN (...)
SELECT NULL = ANY (...)
SELECT NULL::int[] <@ ...

总是屈服NULL

如果您不打算查询NULL值,则可以忽略它。



 类似资料:
  • 本文向大家介绍sqlalchemy 筛选,包括了sqlalchemy 筛选的使用技巧和注意事项,需要的朋友参考一下 示例 给定以下模型 您可以过滤查询中的列: 对于第一种情况,有一个快捷方式: 可以使用AND关系通过链接filter方法来构成过滤器: 或更灵活地使用重载按位运算符&和|: 不要忘记内括号来处理运算符优先级。

  • 我想通过作为字符串的属性名筛选类的集合。假设我有一个名为Person的类,我有它的一个集合,或者是IEnumerable或者是List,我想过滤这个集合,但是我不知道确切的过滤器,我的意思是我不能使用: 让我举一个例子。

  • 问题内容: 我只想通过“ where子句”从数据库中选择(并返回)一个字段。代码是: 这将失败,并且回溯是: 如何选择并仅返回“ id”列?我也尝试了其他几种方法,但也失败了。是“ load_only”正确的选项吗? 问题答案: 一个对象接受实体查询作为位置参数,所以只是通过它: 返回第一个结果的第一个元素;如果未找到任何行,则返回None。它为多行引发异常。 表示仅应加载实体的给定基于列的属性,

  • FundingRank和SourceBucket是枚举,但本质上是int 因此,我试图对treemap >进行排序,排序顺序定义为MinFunding rank和max scorrebucket(阈值为5,如果bucket有5个孩子,这意味着如果有其他更小的bucket有更多的孩子,得分更高的bucket获胜,或者如果有更大的fundinggrank有更高的bucket大小和更多的孩子,仍然是更低

  • 若要用单个列过滤数据文件(DF),如果我们考虑有男性和女性的数据,我们可以: 问题1——但如果数据跨越多年,而我只想看到2014年的男性会怎样? 在其他语言中,我可能会这样做: (除非我想这样做并在新的dataframe对象中获取原始dataframe的子集) 问题2。我如何在一个循环中实现这一点,并为每个独特的年份和性别集(即:2013年男性、2013年女性、2014年男性和2014年女性)创建

  • 问题内容: 我想查询一个结表列的值匹配ID列表的所有值列。 这是我的联结表(): 我有这个查询: 该查询返回的值,并且因为它们都与行的任一或在列。我希望查询返回的内容是因为这是唯一在其列中具有列表所有值的值。 不知道如何更好地解释问题,但是我如何得出结果呢? 问题答案: 您正在寻找对行集有效的查询。我认为带有having子句的分组是最好的方法: 如果可以将所需的ID放在表中,则可以执行以下更通用的