python - 何时使用 SQLAlchemy .get() 与 .filter(Foo.ID == primary_key_id).first()

标签 python sqlalchemy

只是好奇我什么时候会想用一个对比另一个。它们有何不同?

我们的系统设置可以做到这一点:

my_user = User.query().filter(User.ID == 5).first()

my_user = User.query().get(5)

最佳答案

这两行是一回事。只有引发的异常不同。事实上,get() 是在one() 之上实现的。如果您的 filter() 返回的不仅仅是一个结果,那将会有所不同,但这在您的情况下确实是不可能的。

顺便说一下,SQL 没有 GET 操作,它只有 SELECT(带有可选的 LIMIT)。


sqlalchemy/orm/query.py :

def get(self, ident):
    ...
    return self._get_impl(ident, loading.load_on_ident)

sqlalchemy/orm/loading.py :

def load_on_ident(query, key,
                  refresh_state=None, lockmode=None,
                  only_load_props=None):
    ...
    try:
        return q.one()
    except orm_exc.NoResultFound:
        return None

q.one() in turn calls q.one_or_none() .

现在比较first()one_or_none() :

def first(self):
    ...
    ret = list(self[0:1])
    if len(ret) > 0:
        return ret[0]
    else:
        return None


def one_or_none(self):
    ...
    ret = list(self)

    l = len(ret)
    if l == 1:
        return ret[0]
    elif l == 0:
        return None
    else:
        raise orm_exc.MultipleResultsFound(
            "Multiple rows were found for one_or_none()")

因此,first() 执行带有 LIMIT 的 SELECT,one_or_none() 执行无限制的 SELECT。但是,正如我们已经说过的,无论有没有 LIMIT,查询的结果都不会改变,因此两者是等价的。

关于python - 何时使用 SQLAlchemy .get() 与 .filter(Foo.ID == primary_key_id).first(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34299704/

相关文章:

python - SQLAlchemy:如何使用 SQLAlchemy 更改 MySQL 服务器系统变量?

python - Python 中的 getpass.getpass() 函数不起作用?

python - 更有效的 pandas python 命令删除 Nan 行?

python - Django 管理操作的权限

python - SQLAlchemy 过滤器总是返回 false

python - flask-sqlalchemy 插入未映射

python - SQLAlchemy 中是否有等效的 LISTAGG WITHIN GROUP?

python - pandas.Series.where 不适用于字典

python - 尝试排除 "OSError: [Errno 13] Permission denied"错误并写入日志文件

python - 运行并发请求时获取 "Invalid cursor state (0)"(SQLAlchemy & wsgi/python)