You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 04:57:41