2016-05-20 47 views
4
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()) 

假設我們有影片對象:散裝存儲複雜對象的SQLAlchemy

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個別?批量插入會更好,但我不明白爲什麼數據沒有得到持續,如果這樣做。

+0

它無法完全保留,或者ShowTime實例本身持續存在,但沒有相關數據。顯然['bulk_save_objects'](http://docs.sqlalchemy.org/en/latest/orm/session_api.html#sqlalchemy.orm.session.Session.bulk_save_objects)是一個相當低級的API,並且忽略了很多東西,喜歡關係。你有沒有看過['Session.add_all'](http://docs.sqlalchemy.org/en/latest/orm/session_api.html#sqlalchemy.orm.session.Session.add_all)? –

+0

@IljaEverilä我想我沒有提到它。但是是'Showtime'得到堅持,但'關係'被忽略 – halcyonjuly7

回答

5

Session.bulk_save_objects()對於您的用例來說太低級別的API,它會持續多個模型對象及其關係。該文檔是明確這一點:

警告

批量保存功能允許在大多數其他單位的工作特點的費用行的低延遲INSERT/UPDATE。諸如對象管理,關係處理和SQL子句支持等功能默默省略有利於原始INSERT/UPDATES記錄。

在使用此方法之前,請閱讀Bulk Operations的注意事項列表,並完全測試並確認使用這些系統開發的所有代碼的功能。

您應該使用Session.add_all()向會話中添加實例集合。它將一次處理一個實例,但這是您必須爲高級功能(如關係處理)支付的代價。

所以,與其

session.bulk_save_objects(showtime_lists) 
session.commit() 

session.add_all(showtime_lists) 
session.commit() 
+0

那麼這就是我剛剛掃描文檔而不是徹底閱讀它們。 我感謝您強調這一部分。我甚至打算通過使用'SQLAlchemy核心'來做到這一點,但看到關係是相當複雜的......呃...''Session.add_all'它是 – halcyonjuly7

0

您可以手動分配ID:

  1. 在桌子上

  2. 翅得到一個write lock d最高現有ID

  3. 手動生成的ID

而不是鎖定表的遞增序列,你可能能夠在數據庫中的ID序列遞增到"reserve" a block of ids

您必須按照正確的順序插入以避免外鍵違例(或者如果您的引擎允許,請推遲限制)。