如何在SQLAlchemy中编写生成性更新

3 投票
1 回答
577 浏览
提问于 2025-04-17 12:53

我现在在用SQLAlchemy的核心功能,但遇到问题,无法让SQL支持添加条件语句。我希望这段非常通用的更新代码能在我所有的表上都能使用。这样做的目的是为了创建一个通用的插入/更新功能,适用于每个表。通过这种方式,可以写出非常简洁的测试代码和简单的命令行工具,直接传递所有参数和选项,而不需要为每个表复杂地设置不同的子命令。

虽然还需要做一些调整才能完全实现,但现在更新操作应该能正常工作了。不过,虽然SQLAlchemy提到生成查询,但它并没有区分选择查询和更新查询。我查阅了SQLAlchemy的文档、Essential SQLAlchemy、StackOverflow以及几个源代码库,但没有找到相关的信息。

u      = self._table.update()
non_key_kw = {}
for column in self._table.c:
    if column.name in self._table.primary_key:
        u.where(self._table.c[column.name] == kw[column.name])
    else:
        col_name = column.name
        non_key_kw[column.name] = kw[column.name]

print u
result = u.execute(kw)

这个代码运行失败了——它似乎不识别条件语句:

UPDATE struct SET year=?, month=?, day=?, distance=?, speed=?, slope=?, temp=?
FAIL

而且我找不到用这种方式构建更新的例子。有什么建议吗?

1 个回答

2

“where()”这个方法是生成新的,它会返回一个新的 Update() 对象。旧的对象不会被修改:

u = u.where(...)

撰写回答