Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python SQLAlchemy:查找数组列之间的差异_Python_Postgresql_Sqlalchemy - Fatal编程技术网

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;