SQLAlchemy ORM: "AttributeError: Could not locate column in row"

SQLAlchemy ORM: "AttributeError: Could not locate column in row"

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

我的目标是使用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)

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

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'

我在这里做错了什么?我不应该能够访问 ORM 模型的字段吗?还是我误解了 ORM 的概念?

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

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

session.execute(select(User)) 将 return 一个包含 Row 个实例(元组)的列表,您需要对其进行解压:

for row in session.execute(select(Object)):
    # print(row[0].name)  # or 
    print(row["Object"].name)

但我会直接使用 .query Object 的 returns 个实例:

for row in session.query(Object):
    print(row.name)

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

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

for row in session.execute(select(User)).scalars().all():
    print(row.name)

migrating to 2.0.

中提到的