gpt4 book ai didi

python - 使用 SQLAlchemy 创建非持久对象 : wrong employment of backref in a relationship?

转载 作者:太空宇宙 更新时间:2023-11-03 19:05:18 24 4
gpt4 key购买 nike

我想创建给定类 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()

第一个任务存储在第一次提交上 - 这是可以的 - 第二个任务存储在第二次提交上,这是我想避免的。

我的问题是,如何声明任务和主机类,以便仅在明确要求时才将给定实例保留在数据库上?我正确地使用了“cascade_backrefs”吗?

感谢您的帮助。

最佳答案

相反(别担心,我什至不知道该使用哪个方向,直到我尝试一个简单的测试):

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 = 某个主机
  3. backref 启动,具有 somehost.tasks.append(task) 的效果
  4. 第 3 步使“task”成为“host”的子级,因此级联到
  5. cascade_backrefs=False 对于任务意味着,“如果此事件以反向引用开始(在此上下文中,“主机”是反向引用),则不要运行保存更新级联。

关于python - 使用 SQLAlchemy 创建非持久对象 : wrong employment of backref in a relationship?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14899995/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com