我目前正在使用一些看起来如下的遗留代码:
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基础的类,而不是我定义的常规课程。这样做的正确方法是什么?
答案 0 :(得分:0)
您可以使用object_session
查找给定实例的会话。
但如果你定义Book
和Keywords
之间的关系,你甚至不需要打扰:
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
数组,以便不添加逻辑以保持同步。