association_table = Table("association_table",
Base.metadata,
Column("show_id", Integer(), ForeignKey("show_times.id"), primary_key=True),
Column("theater_id", Integer(), ForeignKey("theaters.id")))
association_table2 = Table("association_table2",
Base.metadata,
Column("show_id", Integer(), ForeignKey("show_times.id"), primary_key=True),
Column("movie_id", Integer(), ForeignKey("movies.id")))
class Movie(Base):
__tablename__ = "movies"
id = Column(Integer, primary_key=True)
title = Column(String(), unique=True)
plot = Column(String())
duration = Column(String())
rating = Column(String())
trailer = Column(String())
imdb = Column(String())
poster = Column(String())
summary = Column(String())
class Theater(Base):
__tablename__ = "theaters"
id = Column(Integer, primary_key=True)
Zip_code = Column(String())
city = Column(String())
state = Column(String())
address = Column(String())
phone_number = Column(String())
class Showtime(Base):
__tablename__ = "show_times"
id = Column(Integer, primary_key=True)
date = Column(Date())
theaterz = relationship("Theater", secondary=association_table)
moviez = relationship("Movie", secondary=association_table2)
showtimes = Column(String())
映画オブジェクトがあると仮定します。
movie_1 = Movie(title="Cap Murica",
plot="Cap punches his way to freedom",
duration="2 hours")
movie_2 = Movie(title="Cap Murica 22222",
plot="Cap punches his way to freedom again",
duration="2 hours")
と劇場オブジェクト:
theater = Theater(name="Regal Cinemas",
Zip_code="00000",
city="Houston",
state="TX")
これをshow_times
モデルに一括保存するにはどうすればよいですか?
私はこれをやってみました:
movies = [movie_1, movie_2] # these movie objects are from the code snippet above
show_times = Showtime(date="5/19/2016",
theaterz=[theater],
moviez=movies)
session.add(show_times)
session.commit()
上記の作品を急いでください。しかし、私がこのようにまとめて行うとき:
showtime_lists = [show_time1, show_time2, showtime3] # these are basically just the same show time objects as above
session.bulk_save_objects(showtime_lists)
session.commit()
失敗することはありませんが、データはデータベースに永続化されません。
つまり、各show_time
をセッションに個別に追加する代わりの方法はありますか?一括挿入の方が良いでしょうが、そのようにするとデータが永続化されない理由がわかりません。
Session.bulk_save_objects()
は、複数のモデルオブジェクトとそれらの関係を永続化するユースケースには低レベルのAPIです。ドキュメントはこれについて明確です:
警告
一括保存機能を使用すると、他のほとんどの作業単位機能を犠牲にして、待ち時間の短い行のINSERT/UPDATEが可能になります。オブジェクト管理、関係処理、SQL句のサポートなどの機能はサイレントに省略されますレコードの生のINSERT/UPDATESを支持します。
この方法を使用する前に、 一括操作 の警告リストを読み、これらのシステムを使用して開発されたすべてのコードの機能を完全にテストおよび確認してください。
インスタンスのコレクションをセッションに追加するには、 Session.add_all()
を使用する必要があります。インスタンスを一度に1つずつ処理しますが、それは関係処理などの高度な機能に支払う必要のある代償です。
だから、代わりに
session.bulk_save_objects(showtime_lists)
session.commit()
行う
session.add_all(showtime_lists)
session.commit()
IDは手動で割り当てることができます。
テーブルで 書き込みロック を取得します
最も高い既存のIDを見つける
増加するIDのシーケンスを手動で生成する
テーブルをロックする代わりに、データベース内のIDシーケンスを IDのブロックを「予約」 にインクリメントできる場合があります。
外部キー違反を回避するために、適切な順序で挿入する必要があります(または、エンジンで許可されている場合は制約を延期します)。