1

我想创建给定类任务的对象,将其中一些存储在使用 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()

第一个任务存储在第一次提交上——这没问题——第二个任务存储在第二次提交上,这是我想要避免的。

我的问题是,如何声明 Task 和 Host 类,以便仅在明确要求时才将给定实例保留在 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 回答