sqlalchemy动态创建model以及映射

遇到这样一个需求,使用sqlalchemy作为ORM框架,很多表表结构一致,但表名不一样,所以需要先创建多个model,每个表都去做重复的工作,对于我来说,是无法接受的,于是,使用type动态创建类,并动态绑定metaData这种方式来动态创建类:

from sqlalchemy.orm import mapper
from sqlalchemy import Table,MetaData
metadata = MetaData()

def getNewModel(name):
    t = type(name,(object,),dict())
    user = Table(name,metadata,
        Column('id',Integer,primary_key = True),
        )
    mapper(t,user)
    return t

t1 = getNewModel("t1")
t2 = getNewModel("t2")

如果没有并行的操作多个表的话,其实是可以通过继承from sqlalchemy.ext.declarative import declarative_base 这个类的方法,在运行的时候,动态修改类名.table.name 的方法动态的修改关联的数据库表,但是这种方式,修改的是所有这个类的所有实例,也就是说,所有这个类的对象的映射都会被修改,试过copy或者deepcopy的方法,也试过再new新的类继承这个类,也试过使用metaclass去创建新类重载new方法,但水平有限,始终无法获得两个不同的类(使用继承,deepcopy,metaclass等方式创建的新类,使用id方法可以看到和之前的类已经不是相同的对象了,但是每次修改table.name的时候,还是两个类一起变,很让人费解,没时间去看sqlalchemy的源码了,以后再说吧)

你可能感兴趣的:(python)