mariadb SQL炼金术ORM:“属性错误:无法定位行”“中的列

zd287kbt  于 2022-11-08  发布在  其他
关注(0)|答案(3)|浏览(158)

我现在正在学习SQLAlchemy,但是我遇到了一个让我困惑的错误。是的,在SO上已经有类似的问题了,但是似乎没有一个得到解决。
我的目标是使用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)

New我要为表中的所有条目加载整行:

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。
这个例子是我所能做的最小的例子,我希望任何人都能给我指出正确的方向。有趣的是,插入新行就像一种魅力。

zlwx9yxi

zlwx9yxi1#

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)
mkh04yzy

mkh04yzy2#

“我想在上面补充一些,”范说。
也可以使用session.execute()获取对象示例。

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

这在migrating to 2.0中提到。

fdx2calv

fdx2calv3#

我今天在执行联接两个或多个表的查询时遇到了这个错误。
在更新psycopg2(2.8.6 -〉2.9.3)、SQLAlchemy(1.3.23 -〉1.4.39)和flask-sqlalchemy(2.4.4 -〉2.5.1)之后,Query.all()方法的返回类型是sqlalchemy.engine.row.Row的列表,而在此之前是tuple的列表。例如:

query = database.session.query(model)
query = query.outerjoin(another_model, some_field == another_field)
results = query.all()

# type(results[0]) -> sqlalchemy.engine.row.Row

if isinstance(results[0], (list, tuple)):
     # Serialize as a list of rows
else:
     # Serialize as a single row

相关问题