python - 跨项目重用 SQLAlchemy 模型

标签 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 实例在项目。如果不止一个,他们将不会共享 session 。我该如何解决这个问题?

Here's another question that suggests using mixin classes .那行得通吗? SQLAlchemy 会准确地从混合类中导入外键吗?

最佳答案

当你打电话时

Base = declarative_base()

SA 为此基础创建新的元数据

要重用您的模型,您必须将主要模型的元数据绑定(bind)到可重用模型,但在通过以下方式导入您的可重用模型之前:

Base.metadata = my_main_app.db.metadata

MixIn 类对于重复列声明和扩展类方法很有用。 对于基于 MixIn 的连接可重用应用,您必须在代码中为每个模型手动定义具体类。

Will SQLAlchemy accurately import foreign keys from mixin classes?

带有外键和约束的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'), {})

关于python - 跨项目重用 SQLAlchemy 模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5807694/

相关文章:

python - 如何在不访问注册表的情况下仅返回环境变量中的用户路径?

Python - 实现函数

python - 使用 SqlAlchemy 将数据保存到数据库中,对象不可下标

python - INSERT 命令不按顺序使用 sqlalchemy 和 mysql 大行

python - 何时使用 SQLAlchemy .get() 与 .filter(Foo.ID == primary_key_id).first()

Android:我可以重复使用图层列表吗?

java - 如何在不违反DRY原则的情况下从多个Activity开始一个Activity?

python - 如何用Python构建这个图?

python - 检查 <sqlalchemy.engine.result.ResultProxy> 对象是否为空

java - 我应该如何命名扩展 Android 基础对象的对象