2011-04-27 9 views
6

Tengo algunos modelos estándar de SQLAlchemy que reutilizo en todos los proyectos. Algo como esto:Reutilización de modelos SQLAlchemy en proyectos

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 

me gustaría poner esto en una biblioteca compartida y la importación en cada nuevo proyecto en lugar de cortar y pegar, pero no puedo, porque la instancia declarative_base se define por separado en el proyecto. Si hay más de uno, no compartirán sesiones. ¿Cómo trabajo alrededor de esto?

Here's another question that suggests using mixin classes. Podría eso funcionar? ¿SQLAlchemy importará con precisión claves foráneas de clases mixin?

+0

¿Qué haces con los objetos de base después de esto? Lo último que recuerdo es que pude unir múltiples metadatos de múltiples objetos Base al vincularlos todos al mismo motor. Me imagino que sería suficiente usar una sesión de ese motor para acceder a todas las tablas que ha definido. –

+0

Nada más con el objeto Base. Si lo único que se necesita es vincular los metadatos, podría importar y volver a vincular fácilmente, al tiempo que aseguro que dos aplicaciones separadas no se ejecutan en el mismo proceso de Python. –

Respuesta

3

Cuando se llama a

Base = declarative_base()

SA crear nueva metadata para este Base.

Para volver a utilizar sus modelos debe vincular metadata de los modelos principales para los modelos reutilizables, pero antes de cualquier importación de sus modelos reutilizables por:

Base.metadata = my_main_app.db.metadata

clases MixIn útiles para repetir las declaraciones de columna, y extendiendo los métodos de clase . Para connecting aplicaciones reutilizables basadas en MixIns, debe definir la clase concreta en el código de forma manual para cada modelo.

¿SQLAlchemy importará con precisión claves externas de las clases de mixin?

clase MixIn con clave externa y la restricción

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

Gracias. Déjame intentar eso. –

Cuestiones relacionadas