【发布时间】:2011-12-29 21:52:34
【问题描述】:
在 django 视图中,我需要将字符串数据附加到数据库中现有文本列的末尾。例如,假设我有一个名为“ATable”的表,它有一个名为“aField”的字段。我希望能够以无竞争条件的方式将字符串附加到“aField”的末尾。最初,我有这个:
tableEntry = ATable.objects.get(id=100)
tableEntry.aField += aStringVar
tableEntry.save()
问题是,如果这是同时执行的,两者都可以获得相同的“tableEntry”,然后它们各自独立更新,最后一个“保存”的获胜,丢失另一个附加的数据。
我稍微研究了一下,发现了这个,我希望它可以工作,使用 F 表达式:
ATable.objects.filter(id=100).update(aField=F('aField') + aStringVar)
这里的问题是我得到一个 SQL 错误,说:
operator does not exist: text + unknown
HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts.
尝试更改为“str(aStringVar)”,即使它已经是一个字符串 - 不走运。我发现一些 django 错误报告抱怨类似问题,但我没有看到修复或解决方法。有什么方法可以强制转换 aStringVar 以便将其附加到 F 表达式的文本中?顺便说一句 - 还尝试了“str(F('aField')) + aStringVar”,但将 F 表达式的结果转换为字符串“(DEFAULT: )”。
【问题讨论】:
-
你能看到 Django 尝试执行的 sqlquery 吗?
-
我认为丹尼尔对另一个问题的解释非常明确。作为替代方案,您可以写 custom sql 来执行更新。
-
我搜索了 SO 和一般的网络,但从未遇到过这个答案 - 感谢您指出它。我目前的解决方法是在 django 中使用带有光标的原始 SQL,但它非常丑陋和将我们与我宁愿避免的 postgres 联系起来。
-
所以我做了原始的事情,这让我到现在为止,但我正在使用多处理并且有两个线程显然在争夺数据库连接??我收到一条错误消息,提示“必须在任何查询之前设置 SET TRANSACTION ISOLATION LEVEL”。我在这里达到了我的数据库知识限制。 SO上的一个问题似乎表明我不能这样做,但这似乎很难相信,因为我希望通过网络连接,它完全有可能有几个线程同时接触数据库。
标签: django