给定一个包含列id: int (primary_key), file_path: string的模型tasks,使用SQLAlchemy,我希望在一个事务中执行以下操作:
task = Task()
db.add(task)
db.commit()
task.file_path = "/path/to/%d.txt" % task.id
db.commit()请注意,我需要先提交(),然后才能访问task.id,因此需要两次提交。
通过使用某种lambda,或者通过在Task模型中编写一个设置函数/插入回调,这是可能的吗?
我正在使用PostgreSQL作为后端,并且知道如何在DB中使用触发器来做到这一点。我正在寻找一种比pl/pgsql解决方案更具pythonic风格的方法。
如果你碰巧用SQLSoup知道答案,我也会非常感谢。为了完整起见,前两行的SQLSoup等效项将是task = db.tasks.insert(),其他3行保持不变。
发布于 2014-04-26 00:21:34
为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")https://stackoverflow.com/questions/23293093
复制相似问题