在postgres

时间:2018-02-12 12:03:59

标签: python postgresql psycopg2

我正在尝试通过python中的 psycopg2 在Postgres中插入/更新行。

插入/更新将以下列方式发生:

  1. 尝试插入数据
  2. 如果失败,请检查它是否抛出IntegrityError(重复主键),然后再运行更新查询。
  3. 对于我的情况,可能会在同一行上触发多次更新。为了解决这个问题,我使用 FOR UPDATE 来锁定行。

    我找不到调用Update查询的正确方法,以便:

    1. 第一次更新获取锁定
    2. 同一行上的其他更新等待锁定被释放
    3. 完成后,锁定将被释放并传递给下一个更新查询
    4. 更新查询由不同的线程独立触发。

      FOR UPDATE 是否足以处理上述情况? 以下是我想要做的事情:

      try:
          conn.autocommit = True
          cur = conn.cursor()
          command = '''INSERT INTO table (column1, column2) VALUES ('A','B')'''
          cur.execute(command)
      except psycopg2.IntegrityError as e:
          try:
              lock_row = '''SELECT * FROM table where column1='A' FOR UPDATE'''
              cur.execute(lock_row)
              command = '''UPDATE table SET column2='C' WHERE column1='A' '''
              cur.execute(command)
              updated_rows = cur.rowcount
          except Exception as e:
              print(e)
      except (Exception, psycopg2.DatabaseError) as error:
          print(error)
      finally:
          if conn is not None:
              conn.close()
      

      另外,我应该使用autocommit还是使用BEGIN.SELECT.UPDATE.COMMIT? 我是postgres的新手,所以我上面可能做了很多错事,如果还有什么我应该纠正,请告诉我。

0 个答案:

没有答案