最近在学习sqlalchemy,有个动态修改__tablename__的需求,搜索了好几天,没有太完美的答案,要么看不懂,要么比较古老了,通过研究,整理以下几种sqlalchemy动态修改__tablename__的方法:
在table model类外层嵌套函数,通过函数参数传递table name给dbmodel类,代码如下:
def make_model(_BOOKNAME):
Model = declarative_base() # 生成一个SQLORM基类
class table_model(Model):
__tablename__ = _BOOKNAME
ID = Column(INTEGER(10), primary_key=True)
BOOKNAME = Column(VARCHAR(255), nullable=False)
INDEX = Column(INTEGER(10), nullable=False)
ZJNAME = Column(VARCHAR(255), nullable=False)
ZJTEXT = Column(TEXT, nullable=False)
ZJHERF = Column(VARCHAR(255), nullable=False)
return table_model
调用时 table = make_model('tablename') 即可取得model类
比较固定,仅简单传递参数
不指定表名的model类创建,然后用type函数动态创建类
class table_model_cls(Base_Model):
__abstract__ = True # 关键语句,定义所有数据库表对应的父类
__table_args__ = {"extend_existing": True} # 允许表已存在
ID = Column(INTEGER(6), primary_key=True)
username = Column(String(24), nullable=False)
password = Column(String(16), nullable=False, server_default='123456')
手机 = Column(String(11), nullable=False)
代理人编码 = Column(String(8))
会员级别 = Column(Enum('SSS', 'SS', 'S', 'A', "\\\\'B", 'C'), server_default='C')
会员到期日 = Column(DateTime, server_default=text("CURRENT_TIMESTAMP"))
登陆次数 = Column(INTEGER(2))
备注 = Column(String(255)) # db.ForeignKey('roles.id') 外键
@validates('手机') # 对字段的校验
def validate_手机(self, key, 手机):
assert len(手机) == 11
return 手机
def get_table_model_cls(cid, cid_class_dict={}):
print(1234, cid_class_dict)
if cid not in cid_class_dict:
cls_name = table_name = cid
cls = type(cls_name, (table_model_cls, ), {'__tablename__': table_name})
cid_class_dict[cid] = cls
return cid_class_dict[cid]
table = get_table_model_cls('users')
还有其他方法,比如手动maper等,比较繁琐,本人也没有学会,放弃!!