首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >插入时SQLAlchemy在其他列中使用ID (甚至可能与sqlsoup一起使用)

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

Stack Overflow用户
提问于 2014-04-25 20:23:21
回答 1查看 118关注 0票数 0

给定一个包含列id: int (primary_key), file_path: string的模型tasks,使用SQLAlchemy,我希望在一个事务中执行以下操作:

代码语言:javascript
复制
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行保持不变。

EN

回答 1

Stack Overflow用户

发布于 2014-04-26 00:21:34

file_path保存一个值可能不是一个好主意。我建议你考虑这样做:

代码语言:javascript
复制
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不需要单独保存,并且更灵活(对于这种情况,您可以更改保存文件的目录)。

修正:对于需要不同路径的情况,以下方法可以解决这个问题:

代码语言:javascript
复制
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

然后给出格式字符串作为参数:

代码语言:javascript
复制
task = Task(file_path="/path/to/{0:06d}.txt")
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23293093

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档