使用 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 中实现? 有人知道这方面的第三方库吗? 或者有什么简单的解决方法?

【问题讨论】:

只执行原始 SQL SELECT ... 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 中使用外键列表创建 PostgreSQL 字段

避免在 django 1.4 和 postgresql 8.1 中使用与 bug #10467 相关的 RETURN postgresql 语句

使用 PostgreSQL 在 Django 中寻找读写锁,例如,SELECT FOR SHARE