sqlalchemy动态生成model模型

该博客介绍了如何在Python中使用`type()`函数动态创建SQLAlchemy Model,以应对不同版本SQLite数据库中字段变化的问题。示例展示了如何根据版本`1.0`和`2.0`创建不同的Student Model,并在视图中演示了如何使用动态生成的Model查询数据库。
摘要由CSDN通过智能技术生成

因业务需要从不同时期的sqlite数据库中取数据,不同时期的数据库字段是不同的,但是以往用sqlalchemy管理数据库时的model是写死的,就会导致有些字段错误而报错,这时我们就要根据版本动态生成model

众所周知python里的 type() 函数是可以查看一个实例的class类型,但其实 type() 也可以用来创建一个class类,我们可以利用这一点动态创建model,下面放出例子

#model.py
from sqlalchemy import Column, String, Integer,DateTime
from sqlalchemy.ext.declarative import declarative_base

# 创建对象的基类:
Base = declarative_base()

def test(version):

	def to_dict(self):
		return {c.name: getattr(self, c.name) for c in self.__table__.columns}
	
	if version == "1.0":
		field_dict = {
			"__tablename__" : 'student',
			"id":Column(Integer, primary_key=True, autoincrement=True),
			"name":Column(String(25)),
			"to_dict":to_dict
		}
	elif version == "2.0":
		field_dict = {
			"__tablename__" : 'student',
			"id":Column(Integer, primary_key=True, autoincrement=True),
			"name":Column(String(25)),
			"class":Column(String(25)),
			"gender":Column(String(25)),
			"to_dict":to_dict
		}
	return type("Student",(Base,),field_dict)
	
#view.py
from model import test
from sqlalchemy.orm import sessionmaker
import pymysql

pymysql.install_as_MySQLdb()

# 初始化数据库连接:
sengine = create_engine('mysql+pymysql://账号:密码@地址:3306/数据库名?charset=utf8')
# 创建Session类型:
s_db = sessionmaker(bind=sengine)

def testDynamicGetModel():
	dynamicStudentClass = test('2.0')
	db = s_db()
	result = db.query(dynamicStudentClass).filter_by(class='6班').first()
	db.close()

	student_dict = result.to_dict()

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值