1

関連する 2 つのテーブルに既にデータが入力されています (SQLAlchemy ORM を使用)。ただし、個々のレコードはまだリンクされていません。つまり、外部キー列は空のままです。異なる列の一致に基づいて、外部キー列を一括更新する必要があります。

説明する:

class Location(Base):
    __tablename__ = 'locations'
    id = Column(Integer, primary_key=True)
    x = Column(Float)
    y = Column(Float)


class Stopover(Base):
    __tablename__ = 'stopovers'
    id = Column(Integer, primary_key=True)
    x = Column(Float)
    y = Column(Float)
    location_id = Column(Integer, ForeignKey("locations.id"))
    location = relationship("Location", backref=backref("stopovers"))

したがって、基本的には、「x」列と「y」列を一致させることによって、20,000 以上の「Stopover」レコードのそれぞれを「Location」に関連付ける必要があります。つまり、location_id 列を一括更新します。

このコードは _location_id_ を正しく生成します:

for stpvr in session.query(Stopovers).all():
       stpvr.location_id = session.query(Location.id).\
                           filter_by(x=stpvr.x).\
                           filter_by(y=stpvr.y).one()[0]
       session.commit()

ただし、機能していないようです。Sqliteman を使用してデータベースを調べると、location_ids が更新されていないことがわかります。その上、これにアプローチするはるかにエレガントな方法があるに違いないと私は推測しています。

ドキュメントでは、Correlated Updatesが探しているものに最も近いことがわかりました。ただし、ドキュメントはSQL Expression Languageのみを参照していますが、私はORMを使用しています。私は SQLAlchemy を初めて使用し、ドキュメントを ORM に変換しようとしてもうまくいきませんでした。

この一括更新を実行する最もエレガントな方法を見つけるための助けをいただければ幸いです。前もって感謝します。

4

1 に答える 1