2011-11-24 13 views
13

In user_models.py, ho questo:In SQLAlchemy, come faccio a creare una relazione ForeignKey su 2 diversi file .py?

class Users(Base): 
    __tablename__ = 'account_users' 
    id = Column(Integer, primary_key = True) 
    username = Column(String(255), nullable=False)  
Base.metadata.create_all(engine) 

Quando eseguo questo, creare una tabella utente.

Sul mio altro file, groups_models.py, ho questo:

class Groups(Base): 
    __tablename__ = 'personas_groups' 
    id = Column(Integer, primary_key = True) 
    user_id = Column(Integer, ForeignKey('account_users.id')) #This creates an error!!! 
    user = relationship('Users') #this probably won't work. But haven't hit this line yet. 

Base.metadata.create_all(engine) 

Quindi, come potete vedere, voglio mettere una relazione molti-a-uno dai gruppi -> utenti.

Ma quando corro groups_models.py ... ottengo questo errore:

sqlalchemy.exc.NoReferencedTableError: Foreign key associated with column 'personas_groups.user_id' could not find table 'account_users' with which to generate a foreign key to target column 'id' 

Se metto le due tabelle insieme in un unico file, sono sicuro che potrebbe funzionare ... ma perché ho diviso esso in 2 file (che devo assolutamente fare) ... non so come far funzionare le relazioni di ForeignKey più?

risposta

20

Prova questo

basetest.py

from sqlalchemy import create_engine, ForeignKey 
from sqlalchemy.ext.declarative import declarative_base 
from sqlalchemy.orm import relationship, backref 
from sqlalchemy import Column, Integer, String 
from sqlalchemy import Table, Text 

engine = create_engine('mysql://test:[email protected]/test1', 
        echo=False) 

Base = declarative_base() 

user_models.py

from sqlalchemy import Column, Integer, String 
from sqlalchemy import Table, Text 


#Base = declarative_base() 
from basetest import Base 

class Users(Base): 
    __tablename__ = 'account_users' 
    __table_args__ = {'extend_existing':True} 
    id = Column(Integer, primary_key = True) 
    username = Column(String(255), nullable=False)  

Base.metadata.create_all(engine) 

groups_models.py

from sqlalchemy import create_engine, ForeignKey 
from sqlalchemy.ext.declarative import declarative_base 
from sqlalchemy.orm import relationship, backref 
from sqlalchemy import Column, Integer, String 
from sqlalchemy import Table, Text 

from basetest import Base 
#Base = declarative_base() 
from test1 import Users 

class Groups(Base): 
    __tablename__ = 'personas_groups' 
    __table_args__ = {'extend_existing':True} 
    id = Column(Integer, primary_key = True) 
    user_id = Column(Integer, ForeignKey('account_users2.id')) #This creates an error!!! 
    user = relationship(Users) #this probably won't work. But haven't hit this line yet. 

Base.metadata.create_all(engine) 

Assicurarsi di avere sa me Base per creare tutte le tabelle correlate.

+3

Assicurarsi di avere la stessa base per creare tutte le tabelle correlate !!!!! Ho sprecato mezza giornata per questo: / –

Problemi correlati