【问题标题】:Do I need to recreate a temp table if a postgres connection refreshes?如果 postgres 连接刷新,我是否需要重新创建临时表?
【发布时间】:2020-01-28 11:04:21
【问题描述】:

所以我想上传一个临时表,使用 csv 文件填充它,然后使用相同的连接运行一堆其他查询。目前我正在上传一个普通的表,做我的查询然后删除它。但是我想暂时避免混淆,并避免在代码因某种原因停止(异常/调试等)之前将大量数据留在数据库中,然后才有机会删除表。我正在使用 psycopg2 在 python 中完成所有这些工作。

首先,我假设只要连接处于活动状态,临时表就会一直存在。这是真的?但更重要的是,psycopg2 数据库连接是否会通过重新建立连接来自动处理瞬时连接丢失?我正在运行的查询非常耗时,所以我担心这可能会发生。在哪种情况下,有什么方法可以知道连接何时刷新,以便我可以重新上传临时表?

【问题讨论】:

    标签: python database postgresql psycopg2 temp-tables


    【解决方案1】:

    首先,我假设临时表会一直存在,只要 连接是有效的。这是真的吗?

    TEMPORARY TABLE 会在会话结束时自动删除。因此,会话结束时不会遗漏任何垃圾。

    但更重要的是,数据库连接是否会断开并刷新?

    通常会话不会自动终止。如果您想知道临时表是否会在其他会话中产生任何冲突,您不必担心:临时表只存在于当前会话中。

    在这种情况下,有什么方法可以知道何时连接 刷新以便我可以重新上传临时表?

    我不确定我是否在这里遵循了您的问题,但有一点很清楚:如果会话终止,临时表就会终止。如果您的客户端配置为自动重试与数据库建立连接,它将不会再次看到该表。如果您想在尝试创建已存在的表时避免出现错误消息,请尝试:

    CREATE TEMPORARY TABLE IF NOT EXISTS tb_tmp (...);
    

    并确保它是空的:

    TRUNCATE TABLE tb_tmp;
    

    【讨论】:

    • 我想知道 psycopg2 数据库连接是否真正持久。如果我正在运行一堆耗时的查询,在此期间数据库连接暂时断开然后重新连接,那么我的临时表将消失并且必须重新创建对吗?
    • @Jonathan 是的,如果连接断开,表会立即死亡 :)
    • 我已经编辑了问题以使其更清晰。基本上我想知道如果有一些瞬时连接丢失,psycopg2 是否会自动重新连接到数据库。在这种情况下,我的代码将继续运行,但我的临时表将消失。在这种情况下,我如何知道这种情况何时发生,以便我可以重新创建表?如果这种情况永远不会发生,那就不用担心了。
    • @Jonathan 我明白了。在这种情况下,我恐怕无法帮助你:) 我对psycopg2 不是很熟悉,所以我不能说它是否会自动重试建立连接。如果是这样,以前的临时表就会消失,您必须从头开始重新导入它。我从数据库方面的建议是:在脚本的开头通过 SQL 检查表是否存在:SELECT * FROM information_schema.tables WHERE table_schema = 'public' AND table_name = 't' 或只是尝试再次创建表:CREATE TEMP TABLE IF NOT EXISTS ...; 祝你好运!
    • 是的,这是个好主意,也许是暂时的解决方案。感谢您的帮助!
    【解决方案2】:

    psycopg2 数据库连接是否会通过重新建立连接来自动处理瞬时连接断开?

    您的意思是它会变得不耐烦,杀死一个活跃但“停滞”(例如网络拥塞)的连接,然后用一个新的连接替换它吗?不。如果您愿意,您可能可以编写代码来执行此操作(但您为什么要这样做?)但 psycopg2 本身不会这样做。

    【讨论】:

      猜你喜欢
      • 2022-11-10
      • 2020-06-09
      • 1970-01-01
      • 2013-07-23
      • 2020-04-05
      • 1970-01-01
      • 2015-04-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多