Read-only Django object manager?
我正在进行积极的缓存,我想确保没有人意外地编写直接更新数据库的代码。 我想,解决这个问题的方法是重命名正常对象管理器.rw_objects以供缓存使用,并将.objects替换为在非更新访问时记录警告的管理器,如果有人尝试则抛出异常 从它做一个更新。
我写了一个对象管理器和一个查询集,但我不知道如何检查查询是否正在更新数据库。
有什么建议?
-
谁是这个神秘的"某人",可以"意外"绕过ORM并缓存"直接更新数据库"? 你能考虑打电话给他们并建议他们停止这样做吗? 电话呼叫可能比许多编码便宜得多,也简单得多。 为什么不告诉他们停止这样做?
-
我! (和我的同事们)缓存是那些出现问题可以如此微妙并且长时间被忽视的地方之一,我宁愿让代码防止我的迟钝而不是期望我记住不要愚蠢。 哦,"直接"是指使用ORM代替我的缓存。:-)
我在考虑两种方法。
创建自定义管理器,覆盖_insert(),_update()以引发异常/记录查询,并使用get_query_set()返回覆盖create(),get_or_create()和update()的自定义QuerySet。
如果您正在使用django 1.2,请在settings.py中创建另一个数据库连接,将其命名为"READ_ONLY",并创建一个使用该连接返回QuerSet的自定义管理器(如def get_query_set() return super(ReadOnlyManager, self).get_query_set().using("READ_ONLY"),并将连接标记为只读。(单向 要做到这一点是为数据库连接创建只读用户"READ_ONLY" ....如果您正在使用Postgres,您可以执行诸如如何在PostgreSQL中创建只读用户的操作?)