1

特定のクラスTaskのオブジェクトを作成し、SQLAlchemyを使用してそれらの一部をデータベースに保存し、その他を破棄したいと思います。現在、このクラスは次のもので作成されています。

Base = declarative_base()

class Task(Base):
    __tablename__ = 'tasks'
    id = Column(Integer, primary_key=True)
    hostID = Column(Integer, ForeignKey('hosts.id'))
    name = Column(String)
    host = relationship("Host", backref="tasks", cascade_backrefs=False)

def __init__(self, host, name):
    self.host = host
    self.name = name


class Host(Base):
    __tablename__ = 'hosts'
    id = Column(Integer, primary_key=True)
    hostname = Column(String)

演奏するとき

newTask1= GridTask(myHost, myName)
Session.add(newTask1)
Session.commit()

newTask2= GridTask(myHost, otherName)
Session.commit()

最初のタスクは最初のコミットに保存されます-これはOKです-そして2番目のタスクは2番目のコミットに保存されます。これは避けたいことです。

私の質問は、タスククラスとホストクラスを宣言して、明示的に要求された場合にのみ特定のインスタンスがDBに保持されるようにするにはどうすればよいですか?「cascade_backrefs」を正しく使用していますか?

ご協力ありがとうございました。

4

1 に答える 1

1

その逆です(心配しないでください。簡単なテストを試すまで、どの方向を使用すればよいかさえわかりません):

class Task(Base):
    __tablename__ = 'tasks'
    id = Column(Integer, primary_key=True)
    hostID = Column(Integer, ForeignKey('hosts.id'))
    name = Column(String)
    host = relationship("Host", backref=backref("tasks", cascade_backrefs=False))

    def __init__(self, host, name):
        self.host = host
        self.name = name

これは、メカニズムが次のとおりであるためです。

  1. 新しい仕事
  2. Task.host = somehost
  3. backref が開始され、 somehost.tasks.append(task) の効果があります
  4. 「タスク」を「ホスト」の子にするステップ#3、したがってカスケードされます
  5. cascade_backrefs=False のタスクは、「このイベントが後方参照 (このコンテキストでは "ホスト" が後方参照) で開始された場合、保存更新カスケードを実行しないことを意味します。
于 2013-02-16T02:03:32.583 に答える