【问题标题】:How to know if a record exists in flask-sqlalchemy如何知道flask-sqlalchemy中是否存在记录
【发布时间】:2016-09-20 04:51:39
【问题描述】:

假设我有一个名为person的表,当我想知道id=1的记录是否存在时,我会尝试下面的代码

if Person.query.filter_by(id = 1).count() > 0:
    do_something()

问题是,当id=1 没有记录时,flask-sqlalchemy 只会抛出OperationalError 而不是返回0。这是否意味着countOperationalError 被捕获时为0?换句话说,我应该按以下方式进行吗:

try:
    if Person.query.filter_by(id = 1).count() > 0:
        do_something_when_record_exists()
except OperationalError:
    do_something_when_theres_no_record()
finally:
    other_code()

对我来说,这似乎不是一种优雅的方式。那么有没有更好的方法来实现呢?

【问题讨论】:

    标签: python flask sqlalchemy flask-sqlalchemy


    【解决方案1】:

    更简单的方法是

    from sqlalchemy.sql import exists
        if session.query(exists().where(Person.id == 1)).scalar() is not None: #check if id=1 exists
                do_something_when_record_exists()
        else:#else run when no record is present
            do_something_when_theres_no_record()
        other_code()#run it anyway
    

    【讨论】:

    • 但是Person.query.filter_by(id = 1).count() 会抛出错误,阻止其余代码运行
    • @Searene 已编辑答案,请您现在查看
    • 抱歉,我创建了一个最小的应用程序,但我发现我无法用它重现问题。所以我想知道我原来的应用程序出了什么问题。也许flask-sqlalchemy没有问题。
    【解决方案2】:

    您不需要使用count 来检查它是否存在。你可以这样做:

    if Person.query.get(1):
        do something()
    

    如果没有id=1 的记录,它将返回None。其他情况:

    # filter_by(name='Nancy') for example
    if Person.query.filter_by(id=1).first():
        do something()
    

    【讨论】:

      【解决方案3】:

      原来数据库和我的模型不一致,我删除了数据库重新建表,然后一切正常。

      如果一切正常,Person.query.filter_by(id = 1).count() 应该返回0,而不是在没有记录时抛出错误。

      【讨论】:

        【解决方案4】:

        我不能 100% 确定这是否正确,但其他答案似乎非常低效。与其他答案不同,这个答案至少应该生成正确的 SQL 代码,即使到达那里的 python 代码远非理想:

        if db.session.query(
            Person.query.filter_by(
                            id = id
                    ).exists())
        

        这不会获取记录,因此效率更高。获取记录会浪费带宽,因为它会立即被丢弃。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-01-25
          • 1970-01-01
          • 1970-01-01
          • 2019-04-12
          • 2016-01-01
          • 2013-10-03
          • 2011-01-22
          相关资源
          最近更新 更多