首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PostgreSQL DROP TABLE查询冻结

PostgreSQL DROP TABLE查询冻结
EN

Stack Overflow用户
提问于 2019-08-26 18:24:47
回答 2查看 3.3K关注 0票数 2

我正在编写代码,以便在Anaconda的Spyder环境中用Python创建GUI。在这段代码中,我使用PostgreSQL数据库进行操作,因此我使用psycopg2数据库适配器,以便可以直接从图形用户界面与进行交互。

代码太长了,不能在这里发布,因为它超过3000行,但总而言之,我与数据库交互没有问题,除非我试图删除一个表。

当我这样做时,图形用户界面框架变得没有响应,drop table查询不会删除预期的表,也不会抛出任何错误或其他类似的东西。

在我的代码中,所有导致表被删除的操作都是通过一个函数(DeleteTable)处理的。当我调用这个函数时,没有任何问题,因为我之前已经插入了几个print语句,它们确认一切都是正常的。当我使用cur.execute(sql)代码行执行语句时,就会出现问题。

有人知道为什么我的表不会掉下来吗?

代码语言:javascript
复制
def DeleteTable(table_name):

    conn=psycopg2.connect("host='localhost' dbname='trial2' user='postgres'   password='postgres'")
    cur=conn.cursor()
    sql="""DROP TABLE """+table_name+""";"""
    cur.execute(sql)
    conn.commit()
EN

回答 2

Stack Overflow用户

发布于 2019-08-26 18:32:01

这一定是因为并发事务持有阻塞DROP TABLE语句的锁。

检查pg_stat_activity视图,注意state等于idle in transactionactive的会话,这些会话的xact_start超过几秒钟。

这本质上是一个应用程序错误:您必须确保所有事务都立即关闭,否则可能会发生不好的事情。

票数 6
EN

Stack Overflow用户

发布于 2020-12-10 23:23:18

我在airflow的postgres钩子中使用psycopg2时遇到了同样的问题,我用with statement解决了这个问题。这可能解决了问题,因为连接在with statement中变成了本地连接。

代码语言:javascript
复制
def drop_table():
    with PostgresHook(postgres_conn_id="your_connection").get_conn() as conn:
        cur = conn.cursor()
        cur.execute("DROP TABLE IF EXISTS your_table")

task_drop_table = PythonOperator(
    task_id="drop_table",
    python_callable=drop_table
)

对于上面的原始代码,一个解决方案可能是这样的(我没有测试这个):

代码语言:javascript
复制
def DeleteTable(table_name):

    with psycopg2.connect("host='localhost' dbname='trial2' user='postgres'   password='postgres'") as conn:
        cur=conn.cursor()
        sql="""DROP TABLE """+table_name+""";"""
        cur.execute(sql)
        conn.commit()

如果有人尝试这样做,请发表评论。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57656088

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档