跨项目重用SQLAlchemy模型

10 投票
1 回答
3265 浏览
提问于 2025-04-16 16:31

我有一些标准的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实例是在项目中单独定义的。如果有多个这样的实例,它们就无法共享会话。那我该怎么解决这个问题呢?

这里有另一个问题,建议使用混入类(mixin classes)。这样可行吗?SQLAlchemy能准确地从混入类中导入外键吗?

1 个回答

5

当你调用

Base = declarative_base()

时,SQLAlchemy会为这个Base创建新的metadata(元数据)。

如果你想重复使用你的模型,就必须把主模型的metadata绑定到可重用的模型上,但在导入你的可重用模型之前,你需要这样做:

Base.metadata = my_main_app.db.metadata

MixIn类可以帮助你重复声明列,并扩展类的方法。

如果你想基于MixIn连接可重用的应用,你必须手动为每个模型在代码中定义具体的类。

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'), {})

撰写回答