用单例和动态类在sqlalchemy中做动态表绑定

当我们的数据表需要分库的时候,如果使用了 sqlalchemy 来做 ORM,在做数据表和类关联的时候就很痛苦了,一个类只能和一个表关联。
当然还有一种方法就是修改 model.tablename.name 来解决,但是这个有个问题是只能绑定一次,实例化后修改就无效了。所以我们就需要使用 type 来动态的创建一个类,到这里问题又来了,如果在不同的时候创建了两个相同的类名的时候,程序就会抛出异常。所以类名必须是单例的。整个的实现如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

Base = declarative_base()

class m_model(object):

_mapper = {}

@staticmethod
def model(tablename):
class_name = tablename
modelClass = m_model._mapper.get(class_name, None)

if modelClass is None:
modelClass = type(class_name, (Base,),{
'__module__': __name__,
'__name__': class_name,
'__tablename__': class_name,
'id': Column(Integer, primary_key=True),
'phone': Column(String),
# ......
})
m_model._mapper[class_name] = modelClass
return modelClass()

用单例和动态类在sqlalchemy中做动态表绑定

https://beixiu.net/dev/用单例和动态类在sqlalchemy中做动态表绑定/

作者

张巍

发布于

2016-07-28

更新于

2016-07-28

许可协议

评论