只是好奇我什么时候会想用一个对比另一个。它们有何不同?
我们的系统设置可以做到这一点:
my_user = User.query().filter(User.ID == 5).first()
或
my_user = User.query().get(5)
最佳答案
这两行是一回事。只有引发的异常不同。事实上,get()
是在one()
之上实现的。如果您的 filter()
返回的不仅仅是一个结果,那将会有所不同,但这在您的情况下确实是不可能的。
顺便说一下,SQL 没有 GET 操作,它只有 SELECT(带有可选的 LIMIT)。
def get(self, ident):
...
return self._get_impl(ident, loading.load_on_ident)
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/