2016-09-01 7 views
0

私は、乗客予測モデルのためのジオオブジェクト階層を構築するのに苦労します。flask-sqlalchemyのオブジェクト間の関係を作成する際のIntegrityError

私は、オブジェクトの次の階層があります。この問題を解決する方法を、

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

任意の提案:私はセッションにTransportAreaオブジェクトを追加しようとすると

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 

は、私は次のエラーを取得しますか?

m - dbを含むフラスコアプリを含むモデルのインスタンスです。

+0

SQLを見ると、値 '2'のキーが既に存在しているようです。ですから、id = 2のid = 1を設定しようとすると、ユニークな制約の失敗が発生します。 – sisanared

+0

実際、 'id = 1'(クラス' Region')の 'm.db'にはオブジェクトが1つしかありません。そして、 'm.db.session.add()'オペレーション[エラーが発生する場所]は、id = 2を持つべき新しいオブジェクトTransportationAreaを追加します。私が理解できないのは、このアクションがid = 1を値2で更新しようとしている理由です。 –

+0

'TransportArea'オブジェクトをどのようにセッションに追加するのかコードを共有できますか? – van

答えて

0

最終的にどのように動作するのか理解しました。 foreign_keysキーワードを追加すると、その列を指定してリレーションシップにリンクする必要があります。作業コードは次のとおりです。

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 
関連する問題