0

给定一个tasks带有列的模型id: int (primary_key), file_path: string,使用 SQLAlchemy,我想在一个事务中执行以下操作:

task = Task()
db.add(task)
db.commit()
task.file_path = "/path/to/%d.txt" % task.id
db.commit()

请注意,我需要先 commit() 才能访问task.id,因此需要两次提交。

这是否可能,或者通过使用某种 lambda,或者通过在Task模型中编写 setter 函数/插入回调?

我正在使用 PostgreSQL 作为后端,并且知道如何使用数据库中的触发器来做到这一点。我正在寻找一种比 pl/pgsql 解决方案更 Pythonic 的方式。

如果您碰巧知道使用 SQLSoup 的答案,我也将非常感谢。为了完整起见,前两行的 SQLSoup 等效项为task = db.tasks.insert(),其他 3 行保持不变。

4

1 回答 1

0

为 .保存值可能不是一个好主意file_path。我建议考虑做类似的事情:

class Task(Base):
    __tablename__ = 'task'
    id = sqAl.Column(sqAl.Integer, primary_key=True)
    @property
    def file_path(self):
        #return "/path/to/%d.txt" % self.id
        return "/path/to/{0:06d}.txt".format(self.id)

这种方式task.file_path不需要单独保存并且更灵活(对于您更改保存文件的目录的情况)。

修正:对于这种情况,确实需要不同的路径,以下可以解决:

class Task(Base):
  __tablename__ = 'task'
  id = sqAl.Column(sqAl.Integer, primary_key=True)
  _file_path = sqAl.Column(sqAl.String)
  @property
  def file_path(self):
    return self._file_path.format(self.id)
  @file_path.setter
  def file_path(self, fp):
    self._file_path = fp

然后将格式字符串作为参数:

task = Task(file_path="/path/to/{0:06d}.txt")
于 2014-04-25T16:21:34.227 回答