使用SQLAlchemy更新SQLite表数据时触发AttributeError错误:'User'对象无'c'属性求助
解决SQLAlchemy更新数据时的AttributeError: 'User' object has no attribute 'c'问题
嘿,这个错误我之前也踩过坑!问题出在你混淆了SQLAlchemy两种不同API的用法——你用的是ORM模型类(通过declarative_base定义的User),但却误用了核心表达式API里的.c语法。
错误原因
User.c.password这种写法是给核心API中的Table对象用的,而你的User是ORM映射类,直接通过User.password就能引用对应的字段,根本不需要加.c后缀。
修正后的完整代码
下面是调整后的可运行版本,主要修改了update语句的字段引用方式:
from sqlalchemy import create_engine from sqlalchemy import Column, String from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import sessionmaker from sqlalchemy import update engine = create_engine("sqlite:///tests.db", echo=True) session = sessionmaker(bind=engine)() Base = declarative_base() class User(Base): __tablename__ = "usertable" username = Column(String, primary_key=True) password = Column(String) Base.metadata.create_all(engine) # 添加测试用户(这里可以简化写法) user = User(username="John", password="pass") session.add(user) session.commit() # 关键修正:去掉.c,直接用User.password引用字段 stmt = update(User).where(User.password == 'pass').values(password='PASSWORD') session.execute(stmt) session.commit()
另一种更贴近ORM风格的更新方式
如果你更喜欢ORM的直观写法,也可以先查询到目标对象,再直接修改属性提交:
# 查询到要更新的用户 target_user = session.query(User).filter(User.password == 'pass').first() if target_user: # 直接修改属性 target_user.password = 'PASSWORD' # 提交更改 session.commit()
这种方式更符合ORM的设计思想,适合单条或少量数据的更新场景;而update语句的方式更适合批量更新数据。
内容的提问来源于stack exchange,提问作者Amir Gholami
相关产品推荐
相关产品推荐

