python - SQLAlchemy:避免重复声明式类定义

标签 python sqlalchemy

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

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)
    #...

这样做的好方法是什么?我尝试使用元类,但它还没有用。

最佳答案

您可以将共同属性分解为 mixin class ,并与 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']

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

关于python - SQLAlchemy:避免重复声明式类定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3626787/

相关文章:

python - python 中的 Bokeh 库 : can I provide a custom y range in terms of values to have?

flask - 属性错误 : Neither 'InstrumentedAttribute' object nor 'Comparator' object associated with

SQLAlchemy:为列的每个不同值选择一行

python - Flask - (ProgrammingError) - 构建postgresql数据库时的外键约束

mysql - 使用 sqlalchemy 和 pyro 进行 session 管理

python - 可变大小输入的小批量训练

python - 向客户端呈现 REST Web 服务界面

python - 如何在 Python 中检查日期是否已过(简单)

python - 如何检查 iPython 中对象的内存使用情况?

python-3.x - 是否有一种 python-alembic 方法可以在删除和添加列之间转换数据?