2016-12-28 2 views
8

Ich bin auf einer Mission, endlich sqlAlchemy zu lernen, so dass ich die Vorteile in den kommenden Jahren ernten kann.sqlalchemy klassische Zuordnung Beziehung Problem

Ich bin Hals tief in der sqlalchemy Dokumente und seit zwei Tagen gewesen. Ich bin höllisch auf den klassischen Mapping-Weg, anstatt der deklarativen lernen, bc die db ich möchte, um zu existieren, und hat keine eindeutige ID-Spalte in allen seinen Tabellen. According to this article classical mapping is the way to go under such circumstances

Ich habe die klassischen Beispiele von der sqlalchemy Seite verfolgt, aber ich kann einfach nicht die richtige Beziehungskonfiguration finden, um dies zum Laufen zu bringen.

Hier ist mein Code:

engine = create_engine(
    "mssql+pyodbc://someaddress/test?driver=FreeTDS?TDS_version=8.0", echo=True) 

metadata = MetaData(engine) 

class User(object): 

    def __repr__(self): 
     return "<User(User_id='%s', name='%s', age='%s')>" % (
          self.user_id, self.name, self.age) 
class Email(object): 

    def __repr__(self): 
     return "<User(email_id='%s', address='%s', user_id='%s')>" % (
          self.email_id, self.address, self.user_id) 

users = Table('users', metadata, 
    Column('user_id', Integer, primary_key=True), 
    Column('name', String(40)), 
    Column('age', Integer), 
    schema='test.dbo.users') 

mapper(User, users, properties={'Email': relationship(Email, primaryjoin=users.c.user_id==emails.c.user_id)}) 

emails = Table('emails', metadata, 
    Column('email_id', Integer, primary_key=True), 
    Column('address', String), 
    Column('user_id', Integer, ForeignKey('test.dbo.users.user_id')), 
    schema='test.dbo.emails') 

mapper(Email, emails) 

Session = sessionmaker(bind=engine) 
session = Session() 

mary = session.query(User, Email).filter(User.user_id == Email.user_id) 

Die Verfolgung Fehlermeldung macht es deutlich, dass es die Mapper/Beziehung, die das Problem ist.

InvalidRequestError: One or more mappers failed to initialize - can't proceed with initialization of other mappers. Original exception was: Could not determine join condition between parent/child tables on relationship User.Email - there are no foreign keys linking these tables. Ensure that referencing columns are associated with a ForeignKey or ForeignKeyConstraint, or specify a 'primaryjoin' expression. 

Ich habe eine lange Liste von verschiedenen Dingen versucht, Abhilfe zu schaffen, um zu versuchen, aber ich kann einfach nicht auf den Grund gehen.

Alle Hinweise in die richtige Richtung würden sehr geschätzt werden!

Die sqlalchemy Version, die ich bin, ist;

'1.0.12' 
+0

Wie man es versucht, ohne den 'primaryjoin' Wert in der Einstellung' Benutzer-Mapper-Eigenschaften? Ich denke nicht, dass Sie es brauchen, und Sie verweisen auf "E-Mails", bevor es existiert. – Jack

+0

Hallo @Jack. Danke für dein Interesse. Ich habe. Ich bekomme dann den folgenden Fehler: 'NoForeignKeysError: Konnte die Join-Bedingung zwischen Eltern/Kind-Tabellen in der Beziehung User.Email nicht bestimmen - es gibt keine Fremdschlüssel, die diese Tabellen verknüpfen. Stellen Sie sicher, dass referenzierende Spalten mit ForeignKey oder ForeignKeyConstraint verknüpft sind, oder geben Sie einen Ausdruck "primaryjoin" an.' – Rookie

Antwort

1

hatte ich mehr Glück mit:

Column('user_id', Integer, ForeignKey('users.user_id')), 

ich auch die Tabelle und Mapping-Code leicht neu geordnet:

users = Table('users', metadata, 
    Column('user_id', Integer, primary_key=True), 
    Column('name', String(40)), 
    Column('age', Integer)) 

emails = Table('emails', metadata, 
    Column('email_id', Integer, primary_key=True), 
    Column('address', String), 
    # foreign key to table users 
    Column('user_id', Integer, ForeignKey('users.user_id'))) 

mapper(Email, emails) 

mapper(User, users, properties={ 
    'Email': relationship(
     Email, primaryjoin=users.c.user_id==emails.c.user_id)}) 
Verwandte Themen