2016-08-29 4 views
0

Ich habe db, dass ich nicht ändern kann, es hat zwei Tabellen "Menschen" und "Beziehung". Die Tabelle 'people' hat Namen, IDs und die Spaltenüberschrift (ja/nein). Die Tabelle 'relation' enthält einen Fremdschlüssel 'people.id' für Eltern und eine 'people.id' für ihr Kind. Ich möchte Spalten in der Tabelle Personen verbinden, so kann ichSQLAlchemy Eins-zu-viele-Beziehung (einzelne Tabelle mit Join-Tabelle)

People.query.filter_by(id='id of the parent') 

die Namen der Eltern zu bekommen und es ist Childs. Dies ist mein Code:

class People(db.model): 
    __tablename__ = 'people' 
    id = db.Column(db.integer(), primary_key=True 
    name = db.Column(db.String()) 
    parent = db.Column(db.Integer()) ##0 for no 1 for yes 
    parent_id=db.relationship('Link',backref=db.backref('Link.parent_id') 

class Link(db.Model): 
    _tablename__ = 'link' 
    parent_id=db.Column(db.Integer(),db.ForeignKey('people.id'),primary_key=True) 
    id = db.Column(db.Integer(), db.ForeignKey('people.id'), primary_key=True) 
    dateofbirth = db.Column(db.Integer()) 

SQLAlchemy sagt mir:

ArgumentError: relationship 'parent_id' expects a class or a mapper argument (received: <class 'sqlalchemy.sql.schema.Table'>) 

Entschuldigen Sie mich, wenn ich vermasselt, aber es ist meine erste Frage hier (und auch die ersten Schritte mit SQLAlchemy)

Antwort

1

Typischerweise Sie möchten den Fremdschlüssel und Backref in der gleichen Tabelle wie folgt einrichten:

class Link(db.Model): 
    _tablename__ = 'link' 
    parent_id = db.Column(db.Integer(),db.ForeignKey('people.id'),primary_key=True) 
    parent = db.relationship('People', backref='links') 

Nun können Sie über Link.parent auf jeden Elternteil der Link-Einträge zugreifen, und Sie können eine Liste aller Links zu People-Einträgen über People.links abrufen (unter der Annahme, dass es sich um eine Eins-zu-viele-Beziehung handelt).

Auch wenn People.parent soll dann einen Booleschen Wert darzustellen:

1.) sollten Sie die Standardnamenskonvention folgen und es etwas nennen wie is_parent

2.) Sie sollten Menschen erklären .parent als db.Boolean-Typ, nicht als db.Integer. In den meisten (wahrscheinlich allen) Datenbankimplementierungen ist die Verwendung von Booleschen anstelle von Ganzzahlen (falls zutreffend) effizienter.

Ich hoffe, das hat geholfen.

Verwandte Themen