【问题标题】:Looking for read-write lock in Django using PostgreSQL, e.g., SELECT FOR SHARE使用 PostgreSQL 在 Django 中寻找读写锁,例如,SELECT FOR SHARE
【发布时间】:2020-06-23 23:12:59
【问题描述】:

我正在使用 PostgreSQL 在 Django 中锁定读写锁。

现在我想知道:

  1. 是否有充分的理由未在 Django-ORM 中实现?
  2. 有人知道这方面的第三方库吗?
  3. 或者有什么简单的解决方法?

【问题讨论】:

  • 只执行原始 SQL SELECT ... FOR UPDATE?还有什么比这更简单的呢?

标签: sql django postgresql concurrency django-orm


【解决方案1】:

您不能将逻辑包装在使用 select 进行共享的 pl/pgsql 函数中,然后从 django 调用该函数吗?

【讨论】:

    【解决方案2】:
    1. 是否有充分的理由未在 Django-ORM 中实现?

    您发布的票证可能提供了原因:没有人有足够的动力编写补丁。

    1. 有人知道这方面的第三方库吗?

    不是我,对不起。
    如果你有任何机会考虑放弃 Django 来使用其他 ORM,那么你必须问自己:“我需要一个 Django 中缺少的功能......我会在这个其他 ORM 中缺少哪些功能?”

    1. 或者有什么简单的解决方法?

    可能不会。但这里有一些选择:

    1. 我知道的每个 ORM 都有一个原始 SQL 的逃生口。您可能知道,但不愿意使用它……但是,由于您也缺乏提出拉取请求的动力,这可能意味着您没有数百个需要 SELECT FOR SHARE 功能的请求。所以你应该考虑一下。 Performing raw SQL queries
    2. 提到的存储过程为steve https://docs.djangoproject.com/en/3.0/topics/db/sql/#calling-stored-procedures
    3. 您发布的关于勾选的最后一条评论来自一个人 (David Schwärzle),他声称他有一个解决方案(不是专门针对 PostgreSQL,而是一个解决方案)...也许您应该尝试与他联系。
    4. 还没有尝试过,但添加所需功能的方式可能是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 将小写的应用名称和模型名称与下划线组合在一起。

      【讨论】:

        猜你喜欢
        • 2012-12-08
        • 2014-03-10
        • 2014-11-29
        • 1970-01-01
        • 2011-01-21
        • 2018-12-06
        • 1970-01-01
        • 1970-01-01
        • 2015-08-01
        相关资源
        最近更新 更多