.one() 和 .scalar() 有什么区别

Sye*_*een 7 python sqlalchemy flask-sqlalchemy

SQLAlchemy.one().scalar()SQLAlchemy之间的主要区别是什么,因为两者都做相同的工作。

我看到了一些像tutorialpoint.com这样的网站,但这种解释不足以让我清楚地理解

小智 39

以下是它们的区别以及何时使用它们:

\n

何时使用one()
\n如果您的查询应返回 1 个结果,否则即使返回 0 个结果,也会引发异常 \xe2\x80\x93。换句话说,它不允许 empty results

\n

何时使用 scalar():
\n如果您的查询返回 1 个结果或不返回任何结果。否则抛出异常。换句话说,它确实允许 empty results.

\n


小智 21

SQLAlchemy 有很好的文档。

one()

只返回一个结果或引发异常。

如果查询未选择任何行,则引发 sqlalchemy.orm.exc.NoResultFound。如果返回多个对象标识,或者如果为仅返回标量值而不是完整标识映射实体的查询返回多行,则引发 sqlalchemy.orm.exc.MultipleResultsFound。

one()方法上的链接

scalar()

如果不存在行,则返回第一个结果的第一个元素或 None 。如果返回多行,则引发 MultipleResultsFound。

Scalar()方法上的链接。

如果你有一些与SQLAlchemy相关的问题,我的建议 - 首先,检查文档,因为它非常强大和干净。

  • @IljaEverilä,一和标量都可以完美地与聚合函数配合使用。其中聚合函数的输出显示 1.`.one()` => (5,)。2.`.scalar()` => 5. (5认同)

Gre*_* Li 11

在SQLAlchemy 2.0风格中,结果格式也不同。

one()返回Row对象(命名元组):

>>> session.execute(select(Note)).one()
(<Note>,)
Run Code Online (Sandbox Code Playgroud)

whilescalar()返回单个元素(Row 对象/元组的第一个元素):

<Note>
Run Code Online (Sandbox Code Playgroud)

如果你想用 获取单个元素one(),你可以用 调用它scalars()

>>> session.execute(select(Note)).scalars().one()
Run Code Online (Sandbox Code Playgroud)

或者使用scalar_one()快捷方式:

>>> session.execute(select(Note)).scalar_one()
Run Code Online (Sandbox Code Playgroud)

有关更多详细信息,请参阅 2.0 迁移文档:https://docs.sqlalchemy.org/en/14/changelog/migration_20.html#migration-orm-usage