跨项目重用SQLAlchemy模型

时间:2011-04-27 16:53:26

标签: python sqlalchemy code-reuse

我有一些标准的SQLAlchemy模型,我在项目中重复使用。像这样:

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

Base = declarative_base()

class Category(Base):
    __tablename__ = 'category'

    id = Column(Integer, primary_key=True)
    slug = Column(String(250), nullable=False, unique=True)
    title = Column(Unicode(250), nullable=False)

    def __call__(self):
        return self.title

我想将它放在一个共享库中并将其导入到每个新项目中,而不是剪切和粘贴它,但我不能,因为declarative_base实例是在项目中单独定义的。如果不止一个,他们将不会分享会话。我该如何解决这个问题?

Here's another question that suggests using mixin classes。这可行吗? SQLAlchemy会准确地从mixin类中导入外键吗?

1 个答案:

答案 0 :(得分:3)

致电时

Base = declarative_base()

SA为此metadata创建新的Base

要重复使用模型,必须将metadata主模型绑定到可重用模型,但在通过以下方式导入可重用模型之前:

Base.metadata = my_main_app.db.metadata

MixIn类可用于重复列声明和扩展类方法。 对于基于MixIns的connecting可重用应用程序,您必须在每个模型的manualy中为代码定义具体类。

  

SQLAlchemy会准确导入吗?   来自mixin类的外键?

MixIn类与外键和约束

from sqlalchemy.schema import UniqueConstraint
from sqlalchemy.ext.declarative import declared_attr

class MessageMixIn(object):
    ttime = Column(DateTime)

    @declared_attr
    def sometable_id(cls):
        return Column(Integer, ForeignKey('sometable.id'))

    @declared_attr
    def __table_args__(cls):
        return (UniqueConstraint('sometable_id', 'ttime'), {})