原先有表A,B,C等.也已经做好了AModel
,BModel
,CModel
.
现在因为需求原因(合并库),需要在A,B,C前面加前缀xxx,变成:
xxx_A
,xxx_B
,xxx_C
xxxAModel
,xxxBModel
,xxxCModel
当然手动一个个改也可以,只是一个比较麻烦,二是调用时候,xxxAModel
调用也会很难看
.请问有啥解决方案没?
网上搜到几个,但是不解决问题.
求靠谱方案,谢谢.
sqlalchemy版本:0.9.7
1
Zuckonit 2014-08-19 13:09:54 +08:00
xxx_A,xxx_B,xxx_C这个是表名?
自定义__metaclass__ ======================== xxxAModel,xxxBModel,xxxCModel这个: xxxAModel = AModel xxxBModel = BModel xxxCModel = CModel |
2
beordle 2014-08-19 13:42:55 +08:00 1
这样一定程度上能满足你的需求
class Class(db.Model): __tablename__ = 'wl_class' id = db.Column('class_id', db.Integer, primary_key=True) name = db.Column('class_name', db.String(45), nullable=False, unique=True) products = db.relationship('Product', backref='wl_class', lazy='dynamic') def as_dict(self): return dict([(c, getattr(self, c)) for c in self.__dict__ if c in ('name', 'products')]) 我是觉得这样很方便,__metaclass__应该也可以, 但是注意一旦要用__new__, 因为我觉得__ init__ 的调用时机可能不一定可以 |
3
siteshen 2014-08-19 14:30:47 +08:00 1
_table_prefix = 'v1_'
class BaseModel(BaseModel): @declared_attr def __tablename__(cls): # simple CamelCase to under_score name = ''.join([('_' + ch.lower()) if ch.isupper() else ch for ch in cls.__name__]).strip('_') return _table_prefix + name __abstract__ = True __table_args__ = { 'mysql_engine': 'InnoDB', 'mysql_charset': 'utf8' } # tablename: v1_user_token class UserToken(BaseModel): id = Column(INTEGER(unsigned=True), primary_key=True) |
4
siteshen 2014-08-19 14:32:49 +08:00 1
上面是之前某次用的表明,除了增加 prefix 外,附加功能:CamelCase to under_score。
|
5
bcxx 2014-08-19 14:40:48 +08:00 1
|
6
gkiwi OP |
7
beordle 2014-08-19 22:27:27 +08:00
|
8
gkiwi OP @beordle 我晓得你的意思,我也觉得这样子是合理的,但是用起来确实出现些问题,估计是我哪里写错了.以后有机会我再写个demo试试看.谢啦/
|
9
siteshen 2014-08-21 14:26:42 +08:00
@beordle
@gkiwi 的意思应该是要用继承的方式使用公共字段。这个需要特殊处理,告诉SQLAlchemy建立多个Column。摘取部分代码如下(至于declared_attr的意思,你可以去看看文档,我也不太清楚): http://docs.sqlalchemy.org/en/rel_0_9/orm/extensions/declarative.html#mixing-in-columns from sqlalchemy.ext.declarative import declared_attr class ReferenceAddressMixin(object): @declared_attr def address_id(cls): return Column(Integer, ForeignKey('address.id')) class User(ReferenceAddressMixin, Base): __tablename__ = 'user' id = Column(Integer, primary_key=True) |