【问题标题】:Query works in postgres shell but sometimes fails to return results in psycopg2查询在 postgres shell 中工作,但有时无法在 psycopg2 中返回结果
【发布时间】:2021-08-02 07:28:21
【问题描述】:

我完全被难住了。

查询看起来像这样:

WITH e AS(
    INSERT INTO TEAMS(TEAM_NAME, SPORT_ID, TEAM_GENDER)
        VALUES ('Cameroon U23','1','M')
    ON CONFLICT (TEAM_NAME, SPORT_ID, TEAM_GENDER)
    DO NOTHING
    RETURNING TEAM_ID
)
SELECT * FROM e
UNION
    SELECT TEAM_ID FROM TEAMS WHERE LOWER(TEAM_NAME)=LOWER('Cameroon U23') AND SPORT_ID='1' AND LOWER(TEAM_GENDER)=LOWER('M');

而python代码是这样的:

sqlString = """WITH e AS(
                        INSERT INTO TEAMS(TEAM_NAME, SPORT_ID, TEAM_GENDER)
                            VALUES (%s,%s,%s)
                        ON CONFLICT (TEAM_NAME, SPORT_ID, TEAM_GENDER)
                        DO NOTHING
                        RETURNING TEAM_ID
                    )
                    SELECT * FROM e
                    UNION
                        SELECT TEAM_ID FROM TEAMS WHERE LOWER(TEAM_NAME)=LOWER(%s) AND SPORT_ID=%s AND LOWER(TEAM_GENDER)=LOWER(%s);"""

cur.execute(sqlString, (TEAM_NAME, SPORT_ID, TEAM_GENDER, TEAM_NAME, SPORT_ID, TEAM_GENDER,))
fetch = cur.fetchone()[0]

我得到的错误是关于 "cur.fetchone()[0]" 因为 "cur.fetchone()" 没有为某些返回任何值原因。我也尝试过“cur.fetchall()”,但这是同样的问题。

这个查询每次都可以在普通的 postgres shell 中正常工作。但是,在我使用 psycopg2 的 python 代码中,它有时会出错并且不返回任何内容。当我从 shell 检查数据库时,我正在寻找的数据就在那里,所以它是选择查询应该返回的东西,但不是。

我不确定这是否相关,但我正在创建并发连接(不是连接池)并一次执行多个此类查询。 但是,每个查询都有不同的团队,以防止死锁。

【问题讨论】:

    标签: python sql database postgresql psycopg2


    【解决方案1】:

    我找到了问题。这与我使用并发有关。我说每个查询都有不同的团队是错误的。团队有时可能是相同的。

    但主要问题正在发生,因为我的 INSERT 会尝试放入一些数据并找到重复项,因为并发查询也试图放入相同的数据。但由于某种原因,SELECT 找不到那个数据。我不知道到底是什么问题,但这是我的理解。

    我不得不改为执行 SELECT,检查是否有结果,如果没有结果,则执行 INSERT,如果 INSERT 没有返回任何内容,则执行最终 SELECT。 INSERT 有时不会返回任何内容,因为它与执行第一个 SELECT 后出现的条目发生冲突。

    编辑: 没关系。事实上,问题在于我的 deadlock_timeout 太低了。我的程序实际上并没有达到死锁(两个进程正在互相等待并且不能,因为它们也依赖于另一个完成)。因此,将 deadlock_timeout 增加到大于我的一个进程完成的平均时间是解决方案。 如果您的程序实际上达到死锁,这将不起作用。在这种情况下,请修复它,因为它永远不会陷入死锁。

    希望这对某人有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-18
      • 2019-07-11
      • 1970-01-01
      • 1970-01-01
      • 2020-02-03
      • 2016-11-04
      相关资源
      最近更新 更多