Python SQLAlchemy:查找数组列之间的差异
我有一个名为Python SQLAlchemy:查找数组列之间的差异,python,postgresql,sqlalchemy,Python,Postgresql,Sqlalchemy,我有一个名为UnitOfWork的表,它有3列cases\u identified,cases\u completed和cases\u double\u check,所有这些都是Postgresql整数数组 是否可以编写一个查询(或混合属性)来查找已识别但不在“已完成”或“重复检查”列中的案例 这是我想到的,但SQL表达式不起作用: @hybrid_property def todo(self): return [x for x in self.cases_identified
UnitOfWork
的表,它有3列cases\u identified
,cases\u completed
和cases\u double\u check
,所有这些都是Postgresql整数数组
是否可以编写一个查询(或混合属性)来查找已识别但不在“已完成”或“重复检查”列中的案例
这是我想到的,但SQL表达式不起作用:
@hybrid_property
def todo(self):
return [x for x in self.cases_identified
if x not in self.cases_completed and
x not in self.cases_double_check]
@todo.expression
def todo(cls):
return [x for x in cls.cases_identified
if x not in cls.cases_completed and
x not in cls.cases_double_check]
我在测试查询中遇到的错误是:
test = Session.query(UnitOfWork.todo).first()
NotImplementedError: Operator 'contains' is not supported on this expression
对于这个答案,我将假设
cls.cases\u identified
,cls.cases\u completed
,以及cls.cases\u double\u check
是Python端的postgresql.ARRAY(Integer)
类型
您的@todo.expression
应该只返回以下内容:一个SQL表达式。目前它正在尝试返回python列表。引发此异常是因为a不支持运算符中的,但它确实有一个方法,该方法映射到Postgresql中的@>
运算符,并测试“元素是否为参数数组表达式元素的超集”。另一方面,这不是你想要的。幸运的是,如果x不在…
中,您就有了,很简单
[x for x in cls.cases_identified]
似乎会导致无限循环而不是异常
在Postgresql中获得数组之间的差异已经被广泛地讨论过了,但下面介绍如何使用SQLAlchemy应用这些差异,首先使用:
这有一个缺点,即不提供任何FROM对象(因为它关联了封闭查询中的所有内容),因此您必须像这样发出原始查询:
test = Session.query(UnitOfWork.todo).select_from(UnitOfWork).first()
您还可以使用Postgresql,它为无空整数数组提供特殊函数和运算符:
class UnitOfWork(...):
@todo.expression
def todo(cls):
return (cls.cases_identified - cls.cases_completed -
cls.cases_double_check)
请注意,您必须首先在Postgresql中安装扩展:
CREATE EXTENSION intarray;
对于这个答案,我将假设cls.cases\u identified
,cls.cases\u completed
,以及cls.cases\u double\u check
是Python端的postgresql.ARRAY(Integer)
类型
您的@todo.expression
应该只返回以下内容:一个SQL表达式。目前它正在尝试返回python列表。引发此异常是因为a不支持
运算符中的,但它确实有一个方法,该方法映射到Postgresql中的@>
运算符,并测试“元素是否为参数数组表达式元素的超集”。另一方面,这不是你想要的。幸运的是,如果x不在…
中,您就有了,很简单
[x for x in cls.cases_identified]
似乎会导致无限循环而不是异常
在Postgresql中获得数组之间的差异已经被广泛地讨论过了,但下面介绍如何使用SQLAlchemy应用这些差异,首先使用:
这有一个缺点,即不提供任何FROM对象(因为它关联了封闭查询中的所有内容),因此您必须像这样发出原始查询:
test = Session.query(UnitOfWork.todo).select_from(UnitOfWork).first()
您还可以使用Postgresql,它为无空整数数组提供特殊函数和运算符:
class UnitOfWork(...):
@todo.expression
def todo(cls):
return (cls.cases_identified - cls.cases_completed -
cls.cases_double_check)
请注意,您必须首先在Postgresql中安装扩展:
CREATE EXTENSION intarray;