gpt4 book ai didi

python - Sqlalchemy 对 dict 列表的查询

转载 作者:行者123 更新时间:2023-11-30 22:32:14 25 4
gpt4 key购买 nike

我正在尝试运行一个查询,根据字典列表过滤结果。

让我们更清楚...

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

class Heading(Base):
id = Column(Integer, primary_key=True)
name = Column(String(50), nullable=False)
version = Column(Integer)

另一方面,我有一个看起来像这样的字典列表(Json 格式):

"headings": [
{
"id": 1,
"version": 1
},
{
"id": 2,
"version": 1
}
]

我想在 Heading 表上执行一个查询,排除数据库中的版本等于 (json) 列表中的版本的行。

我尝试执行这样的事情:

res = Heading.query.filter(~Heading.id.in_([d['id'] for d in headings if d['version'] == Heading.version])).all()

数据库如下所示(再次格式化 Json,抱歉):

[
{
"id": 1,
"name": "Heading1",
"version": 2,
},
{
"id": 2,
"name": "Heading2",
"version": 1,
}
]

但无论如何它都会返回 Heading2 行。基本上,我希望查询返回 Json 中未定义的所有行以及数据库中具有较新版本的行。

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

预先感谢您的帮助

编辑:生成的Raw 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_([])

将简单地评估为 true:

In [10]: print(~Heading.id.in_([]))
1 = 1

鉴于您的数据库支持 composite IN queries解决方案是与(id, version)元组进行比较:

In [9]: from sqlalchemy import tuple_

In [10]: session.query(Heading).\
...: filter(~tuple_(Heading.id, Heading.version).in_(
...: [(d['id'], d['version']) for d in headings])).\
...: all()
Out[10]: [<__main__.Heading at 0x7f840cc8ae48>]

In [11]: _[0].name
Out[11]: 'Heading1'

关于python - Sqlalchemy 对 dict 列表的查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45540133/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com