我正在编写代码,以便在Anaconda的Spyder环境中用Python创建GUI。在这段代码中,我使用PostgreSQL数据库进行操作,因此我使用psycopg2数据库适配器,以便可以直接从图形用户界面与进行交互。
代码太长了,不能在这里发布,因为它超过3000行,但总而言之,我与数据库交互没有问题,除非我试图删除一个表。
当我这样做时,图形用户界面框架变得没有响应,drop table查询不会删除预期的表,也不会抛出任何错误或其他类似的东西。
在我的代码中,所有导致表被删除的操作都是通过一个函数(DeleteTable)处理的。当我调用这个函数时,没有任何问题,因为我之前已经插入了几个print语句,它们确认一切都是正常的。当我使用cur.execute(sql)代码行执行语句时,就会出现问题。
有人知道为什么我的表不会掉下来吗?
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()发布于 2019-08-26 18:32:01
这一定是因为并发事务持有阻塞DROP TABLE语句的锁。
检查pg_stat_activity视图,注意state等于idle in transaction或active的会话,这些会话的xact_start超过几秒钟。
这本质上是一个应用程序错误:您必须确保所有事务都立即关闭,否则可能会发生不好的事情。
发布于 2020-12-10 23:23:18
我在airflow的postgres钩子中使用psycopg2时遇到了同样的问题,我用with statement解决了这个问题。这可能解决了问题,因为连接在with statement中变成了本地连接。
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
)对于上面的原始代码,一个解决方案可能是这样的(我没有测试这个):
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()如果有人尝试这样做,请发表评论。
https://stackoverflow.com/questions/57656088
复制相似问题