2016-01-31 28 views
0

內我目前正在與一些舊代碼看起來如下工作:創建在第一的實例第二種模式sqlachemy

from sqlalchemy.ext.declarative import declarative_base 
from sqlalchemy import Unicode 
from sqlalchemy.dialects.postgresql import ARRAY, TEXT 

Base = declarative_base() 

class Book(Base): 

    __tablename__ = 'book' 

    id = Column(Integer, primary_key=True) 
    title = Column(Unicode) 
    keywords = Column('keywords', ARRAY(TEXT), primary_key=False) 

關鍵字,目前正在保持一個數組,但我想變平這一點,讓他們在自己單獨的模型

class Keyword(): 

    __tablename__ = 'keyword' 

    id = Column(Integer, primary_key=True) 
    book_id = Column(Integer, ForeignKey('book.id', ondelete='cascade'), 
     nullable=False) 
    keyword = Column(Unicode) 

我怎樣才能使,使得產生一書()的時候,它還會創建 伴隨的關鍵字?作爲遷移API的中間步驟,我想保留當前的數組列,但也要創建相應的Keyword()實例。

我可以在__init__方法中做到這一點,但需要知道當前Session()是什麼,才能運行提交。我也可以使用property屬性,附加到keywords,但我不確定這是如何工作的,因爲我正在使用從SQLAlchemy的基礎繼承的類,而不是使用我定義的常規類。什麼是正確的方法來做到這一點?

回答

0

您可以使用object_session找出給定實例的會話。

但是,如果你定義一個BookKeywords之間的關係,你不應該需要甚至懶得:

class Book(Base): 
    # ... 
    rel_keywords = relationship('Keyword', backref='book') 

    def init_keyword_relationship(self): 
     for kw in self.keywords: 
      self.rel_keywords.add(Keyword(keyword=kw)) 


sess = # ... get_session... 
books = sess.query(Book).all() 
for book in books: 
    book.init_keyword_relationship() 
sess.commit() 

不過,我會做一個遷移一次,爲了不增加一個擺脫keywords陣列保持這些同步的邏輯。

相關問題