SQLAlchemy:检查对象是否已经存在于表中

18

我有一个类Item,它的id是主键并自动生成。现在我从某个外部来源读取数据,创建一个Item对象,并需要检查这个对象是否已经存在于我的items表中。我应该如何做?


1
这是一个“get_or_create”场景吗?如果是,请参考:https://dev59.com/t3E85IYBdhLWcg3w64EA - Demian Brecht
@DemianBrecht,谢谢你的回复,但不是这样。 - missingfaktor
@missingfaktor 你怎么知道它是否已存在?基于主键还是其他唯一键? - jadkik94
@jadkik94,一组独特的属性。 - missingfaktor
3个回答

22

最有效的方法是使用exists()

q = session.query(Item.id).filter(Item.email==email)
session.query(q.exists()).scalar()    # returns True or False

13
你可以查询具有相同属性的项目,并检查计数是否大于零。
if session.query(Item.id).filter(Item.email==newItem.email,
                                 Item.type==newItem.type).count() > 0:
    // item exists

1
“>0”是多余的,因为count()如果没有找到匹配项则返回零,否则返回正整数。 - kalu
9
“明确优于含蓄。”--Python之禅 - Brendon Crawford
3
使用计数功能会让数据库做比必要更多的工作。请查看下面的答案以获取一种更有效的方法。 - Salami

3
你可以尝试类似这样的做法:

from sqlalchemy import exc

try:
    session.add(item)
    session.commit()
except exc.IntegrityError:
    session.rollback()
    print 'This item fails one of the unique/foreign key checks!'
except:
    print 'There was another error'
    raise
else:
    print 'Everything is OK'

这种方法的问题在于它会在提交时执行,然后回滚...

如果您可以逐个检查属性,则另一种选择可能有效:

session.query(Item).filter_by(x=item.x, y=item.y).count() == 0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接