SQLAlchemy:避免在声明式样式类定义中重复

max*_*max 11 python sqlalchemy

我正在使用SQLAlchemy,我的对象模型中的许多类具有相同的两个属性:id和(整数和主键),以及name(字符串).我试图避免在每个类中声明它们如此:

class C1(declarative_base()):
    id = Column(Integer, primary_key = True)
    name = Column(String)
    #...

class C2(declarative_base()):
    id = Column(Integer, primary_key = True)
    name = Column(String)
    #...
Run Code Online (Sandbox Code Playgroud)

有什么好办法呢?我尝试使用元类但它还没有用.

dha*_*fey 10

你可以将你的公共属性分解为一个mixin类,然后乘以它继承declarative_base():

from sqlalchemy import Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base

class IdNameMixin(object):
    id = Column(Integer, primary_key=True)
    name = Column(String)

class C1(declarative_base(), IdNameMixin):
    __tablename__ = 'C1'

class C2(declarative_base(), IdNameMixin):
    __tablename__ = 'C2'

print C1.__dict__['id'] is C2.__dict__['id']
print C1.__dict__['name'] is C2.__dict__['name']
Run Code Online (Sandbox Code Playgroud)

编辑:您可能认为这会导致C1C2共享相同的Column对象,但正如SQLAlchemy文档中所述,Column对象在源自mixin类时被复制.我已更新代码示例以演示此行为.