【问题标题】:SQLAlchemy ORM: "AttributeError: Could not locate column in row"SQLAlchemy ORM:“AttributeError:无法在行中找到列”
【发布时间】: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。

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

【问题讨论】:

    标签: python sqlalchemy orm mariadb pymysql


    【解决方案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 中提到了这一点。

    【讨论】:

      猜你喜欢
      • 2016-04-23
      • 1970-01-01
      • 1970-01-01
      • 2022-08-24
      • 2013-10-16
      • 2018-08-08
      • 2017-07-22
      • 2016-01-14
      • 2021-06-14
      相关资源
      最近更新 更多