SQLAlchemy automap查询返回对象无__dict__,无法访问属性如何解决?
SQLAlchemy 2.0 Automap查询对象属性访问问题解决办法
几个排查和解决方向:
1. 先确认表结构里真的有id字段
先查下你的user表到底有没有id列,直接在SQLite里跑这条命令:
PRAGMA table_info(user);
要是表本身就没id,那肯定会报错,得换成实际存在的字段名,比如user_id之类的。
2. 给Automap明确指定主键
Automap必须依赖主键才能正确生成类属性,如果你的表没设主键,或者反射时没识别到主键,就会出现属性访问不了的情况。可以手动指定主键反射:
from sqlalchemy import MetaData, Table from sqlalchemy.ext.automap import automap_base from sqlalchemy.orm import Session engine = create_engine("sqlite:///mydatabase.db") metadata = MetaData() # 显式加载user表并指定主键列 user_table = Table('user', metadata, autoload_with=engine, primary_key=['id']) Base = automap_base(metadata=metadata) Base.prepare() User = Base.classes.user session = Session(engine) u1 = session.query(User).first() print(u1.id)
3. 先搞清楚对象到底有哪些属性
不确定属性名的话,用这几个方法查:
- 执行
dir(u1),列出这个对象所有可用的属性和方法 - 用
u1.__mapper__.columns.keys(),直接获取表的所有列名 - 要是
__dict__用不了,先试试访问任意一个存在的属性,或者执行session.expunge(u1)之后再查看__dict__
4. 强制Automap正确反射表
有时候表名大小写、特殊字符会导致反射异常,可以换个方式映射:
Base.prepare(autoload_with=engine, reflect=True) # 或者手动获取映射类 User = Base.classes.get('user') # 实在不行直接用Table对象查询 result = session.query(user_table).first() print(result.id)
内容的提问来源于stack exchange,提问作者Irina
相关产品推荐
相关产品推荐

