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

Posted

技术标签:

【中文标题】SQLAlchemy ORM:“AttributeError:无法在行中找到列”【英文标题】:SQLAlchemy ORM: "AttributeError: Could not locate column in row" 【发布时间】:2021-08-09 21:30:15 【问题描述】:

我现在正在学习 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)

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

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。

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

【问题讨论】:

【参考方案1】:

session.execute(select(User)) 将返回Row 实例(元组)的列表,您需要对其进行解包:

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

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

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

【讨论】:

.query 方法正是我想要的!无法相信我在阅读文档几个小时后没有找到它。 是的,我注意到 v2 API 中不推荐使用查询【参考方案2】:

我想在@Van 上面所说的内容中添加一些内容。

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

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

migrating to 2.0 中提到了这一点。

【讨论】:

以上是关于SQLAlchemy ORM:“AttributeError:无法在行中找到列”的主要内容,如果未能解决你的问题,请参考以下文章

SQLAlchemy -- Python的SQLAlchemy和ORM

ORM框架SQLAlchemy

Python ORM框架之SQLALchemy

Python开发:ORM sqlalchemy

Python3-ORM-Sqlalchemy

SqlAlchemy ORM