给定带有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行保持不变。
答案 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")