在sqlachemy中实例化第一个模型时创建第二个模型

时间:2016-01-31 13:51:29

标签: python sqlalchemy

我目前正在使用一些看起来如下的遗留代码:

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)

我怎样才能创建Book(),它也会创建 随附关键词?作为迁移API的中间步骤,我想保留当前的数组列,但也要创建伴随的Keyword()实例。

我可以在__init__方法中执行此操作,但需要知道当前Session()是什么,以便运行提交。我也许也可以使用附加到property的{​​{1}}属性,但我不确定如果我正在使用一个继承自SQLAlchemy基础的类,而不是我定义的常规课程。这样做的正确方法是什么?

1 个答案:

答案 0 :(得分: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数组,以便不添加逻辑以保持同步。