更新 - 用于postgres的psycopg2游标

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了更新 - 用于postgres的psycopg2游标相关的知识,希望对你有一定的参考价值。

我们正在使用psycopg2 jsonb游标来获取数据和处理但是当新的线程或处理到来时它不应该获取和处理第一个进程或线程的相同记录。

为此,我们尝试使用FOR UPDATE,但我们只想知道我们是否使用了正确的语法。

    con = self.dbPool.getconn()
    cur = conn.cursor()             
    sql="""SELECT jsondoc FROM %s WHERE jsondoc @> %s"”"             
    if 'sql' in queryFilter:                 
   sql += queryFilter 'sql’]   
   When we print this query, it will be shown as below:             
         Query: "SELECT jsondoc FROM %s WHERE jsondoc @> %s AND (jsondoc ->> ‘claimDate')::float <= 1536613219.0 AND ( jsondoc ->> ‘claimstatus' = ‘done' OR jsondoc ->> 'claimstatus' =                    'failed' ) limit 2 FOR UPDATE"         
 cur.execute(sql, (AsIs(self.tablename), Json(queryFilter),)) 
    cur.execute()
    dbResult = cur.fetchall()

请帮助我们澄清语法并解释该语法是否正确,然后该查询如何锁定第一个线程的获取记录。

谢谢,桑杰。

答案

如果执行该示例性查询

select * 
from my_table
order by id
limit 2
for update; -- wrong

然后锁定两个结果行直到事务结束(即下一个connection.rollback()connection.commit()或连接关闭)。如果另一个事务在此期间尝试运行相同的查询,它将一直停止,直到两行被解锁。所以这不是你期望的行为。你应该添加skip locked条款:

select * 
from my_table
order by id
limit 2
for update skip locked; -- correct

使用此子句,第二个事务将跳过锁定的行并返回下两个onces而不等待。

the documentation.中了解它

以上是关于更新 - 用于postgres的psycopg2游标的主要内容,如果未能解决你的问题,请参考以下文章

Python/postgres/psycopg2:获取刚刚插入的行的 ID

Psycopg2 在 postgres 数据库中插入 python 字典

Postgres:使用游标更新的惊人性能

Postgres:使用psycopg2或附近未终止的引用字符串

使用 psycopg2 调用 postgres 存储过程 - 无效的事务终止

带有“%%”参数的 Postgres 查询未通过 psycopg2 返回结果