2016-09-01 2 views
0

Ich habe Mühe, Geo-Objekt-Hierarchie für meine Fahrgast-Vorhersagemodell zu bauen.IntegrityError beim Erstellen von Beziehungen zwischen Objekten in Flask-Sqlalchemy

Ich habe die folgende Hierarchie von Objekten:

class Geoobject(m.db.Model): 
    __tablename__ = 'geoobjects' 
    id = m.db.Column(m.db.Integer, primary_key=True) 
    name = m.db.Column(m.db.String) 

    def __init__(self, code: int, name: str): 
     self.code = code 
     self.name = name 

class Region(Geoobject): 

    __tablename__ = 'regions' 
    id = m.db.Column(m.db.Integer, m.db.ForeignKey('geoobjects.id'), 
        primary_key=True) 
    code = m.db.Column(m.db.Integer) 

    def __init__(self, name: str, code: int): 
     self.name = name 
     self.code = code 
     self.region_id = self.id 

class TransportArea(Geoobject): 

    __tablename__ = 'transport_areas' 
    id = m.db.Column(m.db.Integer, m.db.ForeignKey('geoobjects.id'), 
     primary_key=True, autoincrement=True) 
    region = m.db.relationship('Region', 
          foreign_keys='Region.id', uselist=False) 
    def __init__(self, 
      name: str, 
      region: Iterable[Region]): 
     self.name = name 
     self.region = region 

Wenn ich versuche, Transportarea-Objekt-Sitzung hinzuzufügen, erhalte ich die folgende Fehlermeldung:

IntegrityError: (sqlite3.IntegrityError) UNIQUE constraint failed: geoobjects.id 
[SQL: 'UPDATE geoobjects SET id=? WHERE geoobjects.id = ?'] [parameters: (2, 1)] 

Irgendwelche Vorschläge, wie dieses Problem beheben?

m - ist eine Instanz des Modells, das Flask-App mit db enthält.

+0

Blick auf Ihr SQL, scheint es, dass der Schlüssel mit Wert '2' bereits existiert. Wenn Sie also versuchen, id = 2 mit id = 1 zu setzen, wird ein eindeutiger Constraint-Fehler ausgelöst. – sisanared

+0

Tatsächlich gibt es nur ein Objekt in "m.db" mit "id = 1" (der Klasse "Region"). Und die Operation 'm.db.session.add()' [wo der Fehler auftritt] fügt ein neues Objekt TransportationArea hinzu, das id = 2 haben sollte. Was ich nicht verstehe ist, warum diese Aktion versucht, ID = 1 mit Wert 2 zu aktualisieren. –

+0

Können Sie den Code teilen, wie Sie 'TransportArea'-Objekt zur Sitzung hinzufügen? – van

Antwort

0

Ich habe endlich verstanden, wie es funktionieren soll. Wenn ich das Schlüsselwort foreign_keys hinzufüge, sollte ich eine Spalte dafür angeben und sie mit der Beziehung verknüpfen. Arbeitscode ist unten:

class TransportArea(Geoobject): 

    __tablename__ = 'transport_areas' 
    id = m.db.Column(m.db.Integer, m.db.ForeignKey('geoobjects.id'), 
       primary_key=True, autoincrement=True) 

    region_id = m.db.Column(m.db.Integer, m.db.ForeignKey('regions.id')) 
    region = m.db.relationship('Region', foreign_keys=region_id) 

    def __init__(self, 
      name: str, 
      region: Region 
      ): 
     self.name = name 
     self.region = region 
Verwandte Themen