如何增加 SQLAlchemy 中的计数器

新手上路,请多包涵

假设我有表 tags 有一个字段 count 表示有多少 items 已被给定标签标记。

添加带有现有标签的新项目后,如何在 SQLAlchemy 中增加此计数器?

使用纯 SQL,我将执行以下操作:

 INSERT INTO `items` VALUES (...)
UPDATE `tags` SET count=count+1 WHERE tag_id=5

但是我如何在 SQLAlchemy 中表达 count=count+1

原文由 bodacydo 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 689
2 个回答

如果你有类似的东西:

 mytable = Table('mytable', db.metadata,
    Column('id', db.Integer, primary_key=True),
    Column('counter', db.Integer)
)

您可以像这样增加字段:

 m = mytable.query.first()
m.counter = mytable.c.counter + 1

或者,如果您有一些映射模型,您可以选择编写:

 m = Model.query.first()
m.counter = Model.counter + 1

两个版本都将返回您要求的 sql 语句。但是,如果您不包括该列而只写 m.counter += 1 ,那么新值将在 Python 中计算(并且可能会发生竞争条件)。因此,在此类计数器查询中始终包含一个列,如上面两个示例所示。

原文由 tux21b 发布,翻译遵循 CC BY-SA 4.0 许可协议

如果你使用的是 SQL 层,那么你可以在更新语句中使用任意 SQL 表达式:

 conn.execute(tags.update(tags.c.tag_id == 5).values(count=tags.c.count + 1))

ORM 查询对象也有一个更新方法:

 session.query(Tag).filter_by(tag_id=5).update({'count': Tag.count + 1})

ORM 版本足够智能,如果它在会话中,也可以更新对象本身的计数属性。

原文由 Ants Aasma 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题