Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python SQLAlchemy在插入时在其他列中使用ID(甚至可能使用sqlsoup)_Python_Sql_Postgresql_Sqlalchemy_Sqlsoup - Fatal编程技术网

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")

我很感激你的建议,在大多数情况下我都会像那样解决它。在我的用例中,数据库由两个单独的实例使用,它们以生产者-消费者的方式运行。此外,还有多个不同的生产者将任务提供给同一消费者,这些生产者可能需要不同的文件/文件夹结构。长话短说,我非常肯定,在我的架构中,上面的用例是有意义的,我希望有一个解决方案。