使用 PostgreSQL 在 Django 中寻找读写锁,例如,SELECT FOR SHARE
Posted
技术标签:
【中文标题】使用 PostgreSQL 在 Django 中寻找读写锁,例如,SELECT FOR SHARE【英文标题】:Looking for read-write lock in Django using PostgreSQL, e.g., SELECT FOR SHARE 【发布时间】:2020-06-23 23:12:59 【问题描述】:我正在使用 PostgreSQL 在 Django 中锁定读写锁。
我知道select_for_update
最重要的是,我需要SELECT FOR SHARE
我发现了这个super old Django-ticket
我找不到任何为 Django 实现此功能的第三方库
现在我想知道:
-
是否有充分的理由未在 Django-ORM 中实现?
有人知道这方面的第三方库吗?
或者有什么简单的解决方法?
【问题讨论】:
只执行原始 SQLSELECT ... FOR UPDATE
?还有什么比这更简单的呢?
【参考方案1】:
您不能将逻辑包装在使用 select 进行共享的 pl/pgsql 函数中,然后从 django 调用该函数吗?
【讨论】:
【参考方案2】:是否有充分的理由未在 Django-ORM 中实现?
您发布的票证可能提供了原因:没有人有足够的动力编写补丁。
有人知道这方面的第三方库吗?
不是我,对不起。 如果你有任何机会考虑放弃 Django 来使用其他 ORM,那么你必须问自己:“我需要一个 Django 中缺少的功能......我会在这个其他 ORM 中缺少哪些功能?”
或者有什么简单的解决方法?
可能不会。但这里有一些选择:
-
我知道的每个 ORM 都有一个原始 SQL 的逃生口。您可能知道,但不愿意使用它……但是,由于您也缺乏提出拉取请求的动力,这可能意味着您没有数百个需要
SELECT FOR SHARE
功能的请求。所以你应该考虑一下。 Performing raw SQL queries
提到的存储过程为steve
https://docs.djangoproject.com/en/3.0/topics/db/sql/#calling-stored-procedures
您发布的关于勾选的最后一条评论来自一个人 (David Schwärzle),他声称他有一个解决方案(不是专门针对 PostgreSQL,而是一个解决方案)...也许您应该尝试与他联系。
还没有尝试过,但添加所需功能的方式可能是Writing your own Query Expressions
【讨论】:
【参考方案3】:您可以使用原始查询轻松实现。
from django.db import connection
query = f"""SELECT * FROM "appname_modelname" WHERE id=obj_id FOR SHARE"""
with connection.cursor() as cursor:
cursor.execute(query, None)
obj_id
是 python 变量。
appname_modelname
是 django 在您的数据库中创建的表的名称。默认情况下,Django 将小写的应用名称和模型名称与下划线组合在一起。
【讨论】:
以上是关于使用 PostgreSQL 在 Django 中寻找读写锁,例如,SELECT FOR SHARE的主要内容,如果未能解决你的问题,请参考以下文章
使用 Django 项目在 Docker 中创建 postgresql 数据库
Django/PostgreSQL 全文搜索 - 在 AWS RDS PostgreSQL 上使用 SearchVector 与 SearchVectorField 时的不同搜索结果
尝试在 Django 中使用外键列表创建 PostgreSQL 字段
避免在 django 1.4 和 postgresql 8.1 中使用与 bug #10467 相关的 RETURN postgresql 语句