2016-08-08 17 views
0

Ich möchte eine Beziehung zwischen AuthorComments und Reply zu seinen Kommentaren machen.Beziehung zwischen zwei Tabellen, SQLAlchemy

Hier ist meine models.py:

class AuthorComments(Base): 

    id = db.Column(db.Integer, primary_key=True) 
    author_id = db.Column(db.Integer, db.ForeignKey('author.id')) 
    name = db.Column(db.String(50)) 
    email = db.Column(db.String(50), unique=True) 
    comment = db.Column(db.Text) 
    live = db.Column(db.Boolean) 

    comments = db.relationship('Reply', backref='reply', lazy='joined') 

    def __init__(self,author, name, email, comment, live=True): 

     self.author_id = author.id 
     self.name = name 
     self.email = email 
     self.comment = comment 
     self.live = live 

class Reply(Base): 

    id = db.Column(db.Integer, primary_key=True) 
    reply_id = db.Column(db.Integer, db.ForeignKey('author.id')) 
    name = db.Column(db.String(50)) 
    email = db.Column(db.String(50), unique=True) 
    comment = db.Column(db.Text) 
    live = db.Column(db.Boolean) 

    def __init__(self,author, name, email, comment, live=True): 

     self.reply_id = author.id 
     self.name = name 
     self.email = email 
     self.comment = comment 
     self.live = live 

Warum erhalte ich diese Fehlermeldung: sqlalchemy.exc.InvalidRequestError

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 AuthorComments.comments - there are no foreign keys linking these tables. Ensure that referencing columns are associated with a ForeignKey or ForeignKeyConstraint, or specify a 'primaryjoin' expression.

+0

bitte jede antwort! – Reznov

+0

Es gibt eine Menge Code in Ihrer Frage, die wahrscheinlich nicht benötigt wird, um diesen Fehler zu erzeugen. Können Sie versuchen, ein kleineres Beispiel zu erstellen, das Ihren Fehler noch enthält? – FlyingFoX

+0

die Frage aktualisiert! – Reznov

Antwort

2

Ihr Problem ist, dass SQLAlchemy doesn Für eine bestimmte Zeile der Kindtabelle (Reply) weiß ich, welche Zeile der Elterntabelle (AuthorComments) auswählen! Sie müssen eine Fremdschlüssel Spalte in Reply definieren, die auf eine Spalte der übergeordneten AuthorComments verweist.

Here ist die Dokumentation zum Definieren von Eins-zu-viele-Beziehungen in SQLAlchemy.

Etwas wie folgt aus:

class AuthorComments(Base): 
    __tablename__ = 'author_comment' 
    ... 

class Reply(Base): 
    ... 
    author_comment_id = db.Column(db.Integer, db.ForeignKey('author_comment.id')) 
    ... 
    author_comment = db.relationship(
     'AuthorComments', 
     backref='replies', 
     lazy='joined' 
     ) 

in jedem reply führen eine Beziehung zu einem author_comment so dass some_reply.author_comment_id == some_author_comment.id oder None, wenn keine solche Gleichheit besteht zu erwerben.

Die backref ermöglicht jedem author_comment, umgekehrt eine Beziehung zu einer Sammlung von Antworten replies zu haben, die obige Bedingung erfüllend.

+0

Ich habe versucht den Code oben, tatsächlich keine Fehler erscheint außer in der Datenbank, ich habe einen NULL-Wert für die Autor_comment_id, warum! – Reznov

+0

Ich habe das Problem gelöst, aber auch das gleiche, bekomme die Antwort für alle Kommentare !!! – Reznov

+0

@Reznov Stellen Sie sicher, dass Sie tatsächlich die Datenbank * hinter * SQLAlchemy aktualisieren, wenn Sie die Fremdschlüsselspalte hinzufügen. Wenn Sie 'models.py' nur ändern, wird der Datenbank keine Spalte hinzugefügt. Wenn Sie nicht daran interessiert sind, Ihre Daten zu verlieren, können Sie Ihre Datenbank schnell mit den Befehlen 'drop_all' und' create_all' von Flask-SQLAlchemy neu aufbauen [dokumentiert hier] (http://flask-sqlalchemy.pocoo.org/2.1/ bindet/# creating-and-drop-tables). Andernfalls schlage ich vor, dass Sie sich ein Migrationswerkzeug wie [Alembic] (// alembic.zzzcomputing.com) ansehen; es integriert sich gut mit Flask über [Flask-Migration] (// flask-migrate.readthedocs.io) –

Verwandte Themen