hal*_*ly7 9 python sqlalchemy flask-sqlalchemy
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())
Run Code Online (Sandbox Code Playgroud)
假设我们有电影对象:
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")
Run Code Online (Sandbox Code Playgroud)
和戏剧对象:
theater = Theater(name="Regal Cinemas",
zip_code="00000",
city="Houston",
state="TX")
Run Code Online (Sandbox Code Playgroud)
我们如何将其大量保存到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()
Run Code Online (Sandbox Code Playgroud)
欢呼上述作品.但是当我这样批量做的时候:
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()
Run Code Online (Sandbox Code Playgroud)
它不会失败,但数据也不会持久存储到数据库中.
我的意思是,是否可以show_time单独添加每个会话?批量插入会更好,但我不明白为什么数据不会持久化,如果这样做.
Ilj*_*ilä 21
Session.bulk_save_objects()对于您的用例而言,它是一个太低级别的API,它持久存在多个模型对象及其关系.文档清楚如下:
警告
批量保存功能允许以大多数其他工作单元功能为代价的行的低延迟INSERT/UPDATE.默认情况下,将忽略对象管理,关系处理和SQL子句支持等功能,以支持原始的INSERT/UPDATES记录.
在使用此方法之前,请阅读批量操作的警告列表,并完全测试并确认使用这些系统开发的所有代码的功能.
您应该使用Session.add_all()向会话添加实例集合.它将一次处理一个实例,但这是您必须为高级功能(如关系处理)支付的价格.
所以,而不是
session.bulk_save_objects(showtime_lists)
session.commit()
Run Code Online (Sandbox Code Playgroud)
做
session.add_all(showtime_lists)
session.commit()
Run Code Online (Sandbox Code Playgroud)