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.
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
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. –
Können Sie den Code teilen, wie Sie 'TransportArea'-Objekt zur Sitzung hinzufügen? – van