插入时SQLAlchemy在其他列中使用ID(甚至可能使用sqlsoup)

时间:2014-04-25 12:23:21

标签: python sql postgresql sqlalchemy sqlsoup

给定带有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()

请注意,我需要先提交()然后才能访问task.id,因此这两个提交。

这可能是通过使用某种lambda,还是在Task模型中编写setter函数/ insert回调?

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

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

1 个答案:

答案 0 :(得分: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")