如何将SQLAlchemy反射生成的映射表转为ORM?插入数据报错求助
解决SQLAlchemy反射表后ORM插入报错的问题
嘿,我一眼就看出问题所在啦——你通过sa.Table反射得到的records是SQLAlchemy Core层面的表对象,并不是ORM的模型类,所以直接用records(Col1='sdf', Col2='sdsfdadf')创建实例的方式是行不通的。下面给你两种靠谱的解决办法:
方法一:用SQLAlchemy Core直接插入数据
如果你不需要用ORM的session操作,直接用Core的插入语句就能快速搞定:
# 构造插入语句 insert_stmt = records.insert().values(Col1='sdf', Col2='sdsfdadf') # 执行语句 db_engine.execute(insert_stmt)
方法二:将反射表转换为ORM模型类(推荐用automap)
如果想继续用ORM的session来操作,你可以用automap把反射的表转换成ORM模型类,步骤如下:
from sqlalchemy.ext.automap import automap_base from sqlalchemy.orm import sessionmaker # 初始化automap的基类 Base = automap_base() # 反射数据库中的所有表(也可以指定特定表) Base.prepare(db_engine, reflect=True) # 获取对应'records'表的ORM模型类 Records = Base.classes.records # 接下来就可以正常用session插入了 Session = sessionmaker(bind=db_engine) session = Session() new_record = Records(Col1='sdf', Col2='sdsfdadf') session.add(new_record) session.commit()
补充说明
SQLAlchemy的Core和ORM是两个不同的层面:
sa.Table属于Core,它是对数据库表的底层抽象,不能直接实例化;- ORM模型类(不管是通过
declarative_base定义还是automap生成)是Core表对象的封装,能让你像操作Python对象一样操作数据库行,这才是session能识别的对象。
内容的提问来源于stack exchange,提问作者KillerSnail
相关产品推荐
相关产品推荐

