python - 更新值时 SQLAlchemy 无法设置属性错误
问题描述
我在后端 PostgreSQL 数据库中有一个表mailtable
,我使用 SQLAlchemy ORM 使用给定的mailId
. 对于以下代码,amEngine
已经设置好了。当它到达这mailRow.usercomment = 'Hello World'
条线时,它会抛出:
AttributeError:无法设置属性
Base = declarative_base()
Base.metadata.reflect(amEngine)
metaAm = MetaData()
metaAm.reflect(bind=amEngine)
mt = metaAm.tables['mailtable']
Session = sessionmaker(bind=amEngine)
amSession = Session()
mailRow = amSession.query(
mt
).filter(
mt.c.id == mailId
).first()
mailAddress = mailRow.address
mailRow.usercomment = 'Hello World'
amSession.flush()
amSession.commit()
我需要阅读address
专栏(成功)并更新usercomment
专栏(抛出异常)。两列的 PostgreSQL 类型都是text
. 我怎样才能做到这一点?我确信这一定是一个非常简单的问题,但对于我的生活,我看不到这个问题。
非常感谢。
解决方案
通过调用MetaData.reflect
您要求 SQLAlchemy 自动检测Table
对象,描述您的数据库。您可以使用这些对象来创建与语言无关的 SQL 查询,例如
engine.execute(update(mt).where(mt.c.id==1).values(usercomment='Hello World'))
但是,您还不能使用这些Table
对象来执行正确的 ORM。当您查询一个Table
对象时(通过session.query(mt)
),您将获得以类似只读namedtuple
对象的形式返回给您的结果。设置它们的属性没有意义,因此您观察到异常。
要享受真正的 ORM,您需要创建相应的 ORM 类并将它们映射到Table
对象。
当然,您可以要求 SQLAlchemy 使用automap为您自动反射 ORM 类以及表。这是您可能想要编写的代码:
from sqlalchemy.ext.automap import automap_base
from sqlalchemy.orm import sessionmaker
# Ask SQLAlchemy to reflect the tables and
# create the corresponding ORM classes:
Base = automap_base()
Base.prepare(amEngine, reflect=True)
# This is the ORM class we are interested in:
MailTable = Base.classes.mailtable
# Create the session, query, update and commit:
Session = sessionmaker(bind=amEngine)
session = Session()
mailRow = session.query(MailTable).get(mailId)
mailAddress = mailRow.address
mailRow.usercomment = 'Hello World'
session.commit()
推荐阅读
- javascript - 从数据库迁移 Javascript
- algorithm - 如何查找多重集的所有分区(允许重复的集)
- gradle - 使用 gradle 创建 pyspark zip 文件
- transactions - JOOQ vertx AsyncClassicGenericQueryExecutor 事务管理
- jquery - Peerjs 总是显示 'wss://0.peerjs.com/peerjs?key=peerjs&id=peer-ram&token=xxx' 失败
- python - 如果我们没有更多的列,如何创建 PySpark DataFrames
- c# - 使用带有 c# 的 winium 驱动程序向下滚动
- php - Ajax 响应不会返回数据
- reactjs - React 条件渲染导致多次 api 调用
- prometheus-alertmanager - Prometheus 磁盘警报/规则(IOP、读/写延迟;负载)是否相关?