当我们的数据表需要分库的时候,如果使用了 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()
|