2009-10-19 16 views
5

È necessario che due modelli SQLAlchemy ereditino dalla stessa istanza di declarative_base() se devono partecipare alla stessa sessione? Questo è probabilmente il caso quando si importano due o più moduli che definiscono i modelli SQLAlchemy.Due modelli dichiarativi di SQLAlchemy devono condividere lo stesso dichiarative_base()?

from sqlalchemy.ext.declarative import declarative_base 

Base = declarative_base() 

class SomeClass(Base): 
    __tablename__ = 'some_table' 
    id = Column(Integer, primary_key=True) 
    name = Column(String(50)) 

Base2 = declarative_base() 

class AnotherClass(Base2): 
    __tablename__ = 'another_table' 
    id = Column(Integer, primary_key=True) 
    name = Column(String(50)) 

risposta

4

Uso con successo diverse basi dichiarative in sessione singola. Questo può essere utile quando si utilizzano diversi database: ogni base viene creata con propri metadati e ogni metadata è associato al database separato. Alcune delle basi dichiarative potrebbero definire metodi aggiuntivi o potrebbero utilizzare un altro metaclasse per installare estensioni.

+0

È anche possibile utilizzare una singola sessione con l'argomento binds = {Class: database, ...}. – joeforker

+0

Sicuro. Ma il dizionario di questo tipo è difficile da mantenere quando diventa enorme. Mentre dico di costruirlo automaticamente da diversi oggetti di metadati. –

2

Le classi di base separate funzionano correttamente.

È necessario prestare attenzione quando utilizzano connessioni di database diverse, in tal caso non è possibile utilizzare join tra i due database: ogni query deve essere eseguita in un unico database.

Problemi correlati