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

kcwpcxri  于 2023-06-05  发布在  PostgreSQL
关注(0)|答案(3)|浏览(271)

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

  • 我知道select_for_update
  • 在上面,我需要SELECT FOR SHARE
  • 我发现这个super old Django-ticket
  • 我找不到任何第三方库为Django实现这个

现在我在想:
1.有没有一个很好的理由没有在Django-ORM中实现?
1.有没有人知道第三方的图书馆?
1.或者周围有什么简单的工作?

gojuced7

gojuced71#

难道你不能把逻辑封装在pl/pgsql函数中,使用select来共享,然后从django调用这个函数吗?

yyyllmsg

yyyllmsg2#

1.有没有一个很好的理由没有在Django-ORM中实现?
您发布的票证可能提供了原因:没有人有足够的动机去写补丁。
1.有没有人知道第三方的图书馆?
不是我,抱歉。
如果你正在考虑放弃Django而选择其他ORM,那么你必须问问自己:“我需要一个Django中缺少的功能。我会错过这个ORM中的哪些功能?“
1.或者周围有什么简单的工作?
可能不会但这里有一些选择:
1.我知道的每个ORM都有一个原始SQL的逃生舱口。你可能知道,但不愿意使用它...但是,由于您也缺乏进行pull请求的动机,这可能意味着您没有数百个需要SELECT FOR SHARE功能的请求。所以你应该考虑一下。Performing raw SQL queries

  1. steve提到的存储过程https://docs.djangoproject.com/en/3.0/topics/db/sql/#calling-stored-procedures
    1.最后一条评论来自一个人(大卫Schwärzle),他声称他有一个解决方案(不是专门针对PostgreSQL的,但仍然是一个解决方案)。也许你应该试着联系他
    1.我还没有尝试过,但是您可以通过编写自己的查询表达式来添加所需的功能
yk9xbfzb

yk9xbfzb3#

您可以轻松地使用原始查询实现。

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默认将小写的应用程序名称和模型名称与下划线组合在一起作为表名。

相关问题