如何在SQLAlchemy中编写生成性更新
我现在在用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(...)