Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/289.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.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对dict列表的查询_Python_Json_List_Dictionary_Sqlalchemy - Fatal编程技术网

Python Sqlalchemy对dict列表的查询

Python Sqlalchemy对dict列表的查询,python,json,list,dictionary,sqlalchemy,Python,Json,List,Dictionary,Sqlalchemy,我正在尝试运行一个查询,根据dict列表筛选结果 让我们更清楚 我有一个表标题,每个标题都有一个版本字段 class Heading(Base): id = Column(Integer, primary_key=True) name = Column(String(50), nullable=False) version = Column(Integer) 另一方面,我有一个dict列表,看起来像这样(Json格式): 我想在标题表上执行一个查询,排除数据库中的版本与

我正在尝试运行一个查询,根据dict列表筛选结果

让我们更清楚

我有一个表标题,每个标题都有一个版本字段

class Heading(Base):
    id = Column(Integer, primary_key=True)
    name = Column(String(50), nullable=False)
    version = Column(Integer)
另一方面,我有一个dict列表,看起来像这样(Json格式):

我想在标题表上执行一个查询,排除数据库中的版本与(json)列表中的版本相同的行

我试着执行这样的操作:

res = Heading.query.filter(~Heading.id.in_([d['id'] for d in headings if d['version'] == Heading.version])).all()
对于如下所示的数据库(再次格式化Json,抱歉):

但它还是返回Heading2行。基本上,我希望查询返回Json中未定义的所有行以及DB中具有更新版本的行

我不知道我的问题是否足够清楚。 也许这不是正确的方法,请让我知道

提前谢谢你的帮助

编辑: 生成的原始SQL如下所示:

SELECT heading.id, heading.name, heading.version
FROM heading
WHERE heading.id = heading.id
所以sqlalchemy查询有一个明显的问题,但我不知道是什么

我认为这是来自于角色

if d['version'] == Heading.version

但是我不知道如何在查询的其他地方重新表述这个条件,因为您怀疑问题出在

[... for ... if d['version'] == Heading.version]
虽然
d['version']==Heading.version
生成了一个SQL表达式对象,但Python随后使用其真值进行过滤:

In [9]: bool(headings[0]['version'] == Heading.version)
Out[9]: False
所以你的列表理解结果是一个空列表。
Heading.id
永远不可能在空列表中,所以

~Heading.id.in_([])
将简单地评估为真:

In [10]: print(~Heading.id.in_([]))
1 = 1
考虑到数据库支持,解决方案是与(id、版本)元组进行比较:

[9]中的
:来自sqlalchemy导入元组_
在[10]中:session.query(标题)\
…:过滤器(~tuple_)(Heading.id,Heading.version).in_(
…:[(d['id',d['version'])用于标题中的d])\
…:全部()
出[10]:[]
在[11]:[0]中。名称
Out[11]:“Heading1”

正如您所怀疑的,问题出在

[... for ... if d['version'] == Heading.version]
虽然
d['version']==Heading.version
生成了一个SQL表达式对象,但Python随后使用其真值进行过滤:

In [9]: bool(headings[0]['version'] == Heading.version)
Out[9]: False
所以你的列表理解结果是一个空列表。
Heading.id
永远不可能在空列表中,所以

~Heading.id.in_([])
将简单地评估为真:

In [10]: print(~Heading.id.in_([]))
1 = 1
考虑到数据库支持,解决方案是与(id、版本)元组进行比较:

[9]中的
:来自sqlalchemy导入元组_
在[10]中:session.query(标题)\
…:过滤器(~tuple_)(Heading.id,Heading.version).in_(
…:[(d['id',d['version'])用于标题中的d])\
…:全部()
出[10]:[]
在[11]:[0]中。名称
Out[11]:“Heading1”

您也可以发布原始SQL查询吗?您也可以发布原始SQL查询吗?非常感谢您的回答,这比我找到的解决方案要优雅得多。肯定会在查询中重用这些组合。非常感谢您的回答,这比我找到的解决方案要优雅得多。肯定会在查询中重用这些组合。