Python SQLAlchemy在插入时在其他列中使用ID(甚至可能使用sqlsoup)
给定一个带有列Python SQLAlchemy在插入时在其他列中使用ID(甚至可能使用sqlsoup),python,sql,postgresql,sqlalchemy,sqlsoup,Python,Sql,Postgresql,Sqlalchemy,Sqlsoup,给定一个带有列id:int(主键),文件路径:string,使用SQLAlchemy的模型tasks,我想在一个事务中执行以下操作: task = Task() db.add(task) db.commit() task.file_path = "/path/to/%d.txt" % task.id db.commit() 请注意,在访问task.id之前,我需要先提交(),因此需要进行两次提交 通过使用某种lambda,或者在任务模型中编写setter函数/插入回调,这是可能的吗 我使用Po
id:int(主键),文件路径:string
,使用SQLAlchemy的模型tasks
,我想在一个事务中执行以下操作:
task = Task()
db.add(task)
db.commit()
task.file_path = "/path/to/%d.txt" % task.id
db.commit()
请注意,在访问task.id
之前,我需要先提交(),因此需要进行两次提交
通过使用某种lambda,或者在任务
模型中编写setter函数/插入回调,这是可能的吗
我使用PostgreSQL作为后端,并且知道如何在DB中使用触发器来实现这一点。我正在寻找一种比pl/pgsql解决方案更具python风格的方法
如果您碰巧知道使用SQLSoup的答案,我也将非常感谢。为了完整性起见,前两行的SQLSoup等价物是
task=db.tasks.insert()
,其他三行保持不变。为文件路径保存一个值可能不是一个好主意。我建议考虑做一些类似的事情:
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\u 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")
我很感激你的建议,在大多数情况下我都会像那样解决它。在我的用例中,数据库由两个单独的实例使用,它们以生产者-消费者的方式运行。此外,还有多个不同的生产者将任务提供给同一消费者,这些生产者可能需要不同的文件/文件夹结构。长话短说,我非常肯定,在我的架构中,上面的用例是有意义的,我希望有一个解决方案。