Python Sqlalchemy对dict列表的查询
我正在尝试运行一个查询,根据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格式): 我想在标题表上执行一个查询,排除数据库中的版本与
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查询吗?非常感谢您的回答,这比我找到的解决方案要优雅得多。肯定会在查询中重用这些组合。非常感谢您的回答,这比我找到的解决方案要优雅得多。肯定会在查询中重用这些组合。