【问题标题】:SQLAlchemy: Check if object is already present in tableSQLAlchemy:检查表中是否已经存在对象
【发布时间】:2012-09-26 18:25:30
【问题描述】:

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

【问题讨论】:

  • 这是get_or_create 场景吗?如果是这样:stackoverflow.com/questions/2546207/…
  • @DemianBrecht,感谢您的回复,但不,不是。
  • @missingfaktor 你怎么知道它是否已经存在?基于主键?还是其他一些唯一键?
  • @jadkik94,一组独特的属性。

标签: python python-3.x sqlalchemy


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    您可以查询具有相同属性的项目并检查计数是否大于零。

    if session.query(Item.id).filter(Item.email==newItem.email,
                                     Item.type==newItem.type).count() > 0:
        // item exists
    

    【讨论】:

    • >0 是多余的,因为 count() 如果没有找到匹配项则返回零,否则返回正整数。
    • @kalu:“显式优于隐式。” -- Python之禅
    • 使用 count 可以让数据库做更多的工作。请参阅下面的答案以了解有效的方法。
    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多