Повторное использование моделей SQLAlchemy в разных проектах - PullRequest
8 голосов
/ 27 апреля 2011

У меня есть несколько стандартных моделей 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 .Может ли это работать?Будет ли SQLAlchemy точно импортировать внешние ключи из классов mixin?

1 Ответ

3 голосов
/ 28 апреля 2011

при звонке

Base = declarative_base()

SA создайте новый metadata для этого Base.

Для повторного использования ваших моделей вы должны привязать metadata основных моделей к моделям многоразового использования, но перед любым импортом ваших моделей многократного использования:

Base.metadata = my_main_app.db.metadata

Классы MixIn полезны для повторения объявлений столбцов и расширения методов классов. Для connecting многократно используемых приложений, основанных на MixIns, вы должны определить конкретный класс в коде вручную для каждой модели.

Будет ли 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'), {})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...