SQLAlchemy ORM:“AttributeError:无法在行中找到列”

Joh*_*rum 10 python orm sqlalchemy mariadb pymysql

我现在正在学习 SQLAlchemy,但遇到了一个令我困惑的错误。是的,这里已经有类似的问题了,但似乎没有一个得到解决。

我的目标是使用ORM模式来查询数据库。所以我创建了一个模型:

from sqlalchemy import Column, Integer, String, create_engine
from sqlalchemy.orm import Session, registry
from sqlalchemy.sql import select

database_url = "mysql+pymysql://..."

mapper_registry = registry()
Base = mapper_registry.generate_base()


class User(Base):
    __tablename__ = "user"

    id = Column(Integer, primary_key=True)
    name = Column(String(32))


engine = create_engine(database_url, echo=True)
mapper_registry.metadata.create_all(engine)
Run Code Online (Sandbox Code Playgroud)

新我想加载表中所有条目的整行:

with Session(engine) as session:
    for row in session.execute(select(User)):
        print(row.name)

#- Error: #

Traceback (most recent call last):
...
    print(row.name)
AttributeError: Could not locate column in row for column 'name'
Run Code Online (Sandbox Code Playgroud)

我在这里做错了什么?我不应该能够访问 ORM 模型的字段吗?或者我误解了 ORM 的想法?

我使用 Python 3.8 和 PyMySQL 1.0.2 和 SQLAlchemy 1.4.15,服务器运行 MariaDB。

这是我能做到的最小例子,我希望任何人都能指出我正确的方向。有趣的是,插入新行就像一个魅力。

van*_*van 19

session.execute(select(User))Row将返回您需要解压的实例(元组)列表:

for row in session.execute(select(Object)):
    # print(row[0].name)  # or 
    print(row["Object"].name)
Run Code Online (Sandbox Code Playgroud)

但我会使用直接.query返回实例的Object

for row in session.query(Object):
    print(row.name)
Run Code Online (Sandbox Code Playgroud)

  • @MontanaBurr `session.execute(select(Object)).all()`。`scalars()` 方法解压元组。您可以省略它以按原样获取元组。 (5认同)
  • 是的,我注意到 v2 API 中不推荐使用查询 (4认同)

Del*_*hiX 15

我想对上面 @Van 所说的内容进行一些补充。

session.execute()您也可以使用获取对象实例。

for row in session.execute(select(User)).scalars().all():
    print(row.name)
Run Code Online (Sandbox Code Playgroud)

迁移到 2.0时提到了这一点。