使用SQLAlchemy创建非持久对象:在关系中错误使用backref?

时间:2013-02-15 17:22:10

标签: python sqlalchemy

我想创建给定类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-而第二个任务存储在第二个提交中,我想避免的。

我的问题是,我如何声明Task和Host类,以便只有在明确要求时才会在DB上保留给定的实例?我正确使用“cascade_backrefs”?

感谢您的帮助。

1 个答案:

答案 0 :(得分: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(任务)
  4. 的效果
  5. 其步骤#3使“任务”成为“主持人”的孩子,因此在
  6. 中进行了级联
  7. cascade_backrefs =任务上的False意味着,“如果此事件以backref启动(在此上下文中”host“是backref),请不要运行save-update级联。