Python 批量保存复杂对象SQLAlchemy

Python 批量保存复杂对象SQLAlchemy,python,sqlalchemy,flask-sqlalchemy,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", I

假设我们有电影对象:

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")
我们如何将其批量保存到
show\u times
模型中

我试过这样做:

theater = Theater(name="Regal Cinemas",
                  zip_code="00000",
                  city="Houston",
                  state="TX")
万岁以上的作品。但是当我像这样大量地做的时候:

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()
它不会失败,但数据也不会持久化到数据库中

我的意思是,除了将每个
show\u time
单独添加到会话中,还有其他选择吗?大容量插入会更好,但我不明白为什么这样做数据就不能持久化。

对于您的用例来说太低级了,即持久化多个模型对象及其关系。文件明确说明了这一点:

警告

大容量保存功能允许以牺牲大多数其他工作单元功能为代价,降低行的插入/更新延迟。对象管理、关系处理和SQL子句支持等功能被悄悄省略,以支持原始插入/更新记录

在使用此方法之前,请阅读上的警告列表,并充分测试和确认使用这些系统开发的所有代码的功能

您应该使用将实例集合添加到会话中。它将一次处理一个实例,但这是您为关系处理等高级功能付出的代价

因此,与其

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()


您可以手动分配ID:

  • 在桌子上放一张桌子

  • 查找现有的最高id

  • 手动生成不断增加的ID序列

  • 您可以将数据库中的id序列增加到,而不是锁定表


    您必须以正确的顺序插入,以避免外键冲突(或延迟约束,如果您的引擎允许)。

    它是否无法完全持久化,或者
    ShowTime
    实例本身是否得到持久化,但没有相关数据。显然,它是一个相当低级的API,忽略了很多东西,比如关系。你看过吗?@IljaEverilä我想我没提过。但是是的,
    Showtime
    get persistent,但是,
    relationships
    get ignoredWell,这就是我仅仅扫描文档而不是彻底阅读文档的结果。我感谢你强调这一部分。我甚至打算通过使用
    SQLAlchemy核心来实现这一点,但考虑到两者之间的关系相当复杂。。嗯<代码>会话。添加所有内容
    
    session.bulk_save_objects(showtime_lists)
    session.commit()
    
    session.add_all(showtime_lists)
    session.commit()