【问题标题】:drop table timing out using psycopg2 (on postgres)使用 psycopg2 删除表超时(在 postgres 上)
【发布时间】:2022-12-03 11:24:24
【问题描述】:

我无法在 python 中使用 psycopg2 删除具有依赖项的表,因为它超时。 (更新以删除不相关的信息,感谢@Adrian Klaver 迄今为止的帮助)。

我有两个 docker 图像,一个运行 postgres 数据库,另一个运行 python flask 应用程序,利用多个 psycopg2 调用来创建表、插入行、选择行和(未成功删除特定表)。

我尝试过的事情:

  • 使用psycopg2选择数据,插入数据
  • 使用 psycopg2 成功删除了一些表
  • 尝试(未成功)删除特定表“davey1”(通过 psycopg2 我遇到了同样的超时问题)
  • 看着桌子上的锁SELECT * FROM pg_locks l JOIN pg_class t ON l.relation = t.oid AND t.relkind = 'r' WHERE t.relname = 'davey1';
  • 查看运行select * from pg_stat_activity;的进程

特别是我调用该函数的代码(我已经为测试对表名进行了硬编码):

@site.route("/drop-table", methods=['GET','POST'])
@login_required
def drop_table():
    form = DeleteTableForm()
    if request.method == "POST":
        tablename = form.tablename.data
        POSTGRES_USER= os.getenv('POSTGRES_USER')
        POSTGRES_PASSWORD= os.getenv('POSTGRES_PASSWORD')
        POSTGRES_DB = os.getenv('POSTGRES_DB')
        POSTGRES_HOST = os.getenv('POSTGRES_HOST')
        POSTGRES_PORT = os.getenv('POSTGRES_PORT')
        try:
            conn = psycopg2.connect(database=POSTGRES_DB, user=POSTGRES_USER,password=POSTGRES_PASSWORD,host=POSTGRES_HOST,port=POSTGRES_PORT)
            cursor = conn.cursor()
            sql_command = "DROP TABLE "+ str(tablename)
            cursor.execute(sql_command)        
            conn.commit()
            cursor.close()
            conn.close()
        except Exception as e:
            flash("Unable to Drop table " + tablename +" it does not exist","error")
            app.logger.info("Error %s", str(e))
            cursor.close()
            conn.close()
    return render_template("drop-table.html", form=form)

7/11 更新 - 我不知道为什么,但问题是由任一烧瓶引起的@要求登录和/或访问“当前用户"(这两个函数都是flask_login),在我的代码中,我将它们导入为 from flask_login import login_required,current_user。我不知道为什么会这样,这真的很烦人。

如果我注释掉上面的 @login_required 装饰器,它工作正常,日志如下所示:

2022-11-07 09:36:45.854 UTC [55] LOG:  statement: BEGIN
2022-11-07 09:36:45.854 UTC [55] LOG:  statement: DROP TABLE davey1
2022-11-07 09:36:45.858 UTC [55] LOG:  statement: COMMIT
2022-11-07 09:36:45.867 UTC [33] LOG:  statement: BEGIN
2022-11-07 09:36:45.867 UTC [33] LOG:  statement: SELECT users.user_id AS users_user_id, users.name AS users_name, users.email AS users_email, users.password AS users_password, users.created_on AS users_created_on, users.last_login AS users_last_login, users.email_sent AS users_email_sent, users.verified_account AS users_verified_account, users.email_confirmed_on AS users_email_confirmed_on, users.number_of_failed_runs AS users_number_of_failed_runs, users.number_of_logins AS users_number_of_logins, users.datarobot_api_token AS users_datarobot_api_token, users.document_schema AS users_document_schema, users.column_to_classify AS users_column_to_classify, users.column_name_for_title AS users_column_name_for_title 
        FROM users 
        WHERE users.user_id = 1
2022-11-07 09:36:45.875 UTC [33] LOG:  statement: ROLLBACK

当我在代码中包含 @login_required 时,删除表超时并且我收到此日志:

2022-11-07 09:38:37.192 UTC [34] LOG:  statement: BEGIN
2022-11-07 09:38:37.192 UTC [34] LOG:  statement: SELECT users.user_id AS users_user_id, users.name AS users_name, users.email AS users_email, users.password AS users_password, users.created_on AS users_created_on, users.last_login AS users_last_login, users.email_sent AS users_email_sent, users.verified_account AS users_verified_account, users.email_confirmed_on AS users_email_confirmed_on, users.number_of_failed_runs AS users_number_of_failed_runs, users.number_of_logins AS users_number_of_logins, users.datarobot_api_token AS users_datarobot_api_token, users.document_schema AS users_document_schema, users.column_to_classify AS users_column_to_classify, users.column_name_for_title AS users_column_name_for_title 
        FROM users 
        WHERE users.user_id = 1
2022-11-07 09:38:37.209 UTC [38] LOG:  statement: BEGIN
2022-11-07 09:38:37.209 UTC [38] LOG:  statement: DROP TABLE davey1

我什至尝试在我的代码中放置一个“time.sleep(10)”来等待流氓数据库事务回滚(从日志来看,这似乎是 login_required 造成的?!。

我不知道如何解决这个问题,甚至无法进一步调试。

【问题讨论】:

  • 数据库服务器的日志文件中显示了什么错误?
  • 您的最后一张图片切断了右侧的数据(不将文本作为图片发布的原因之一......)。 “授予”栏中的内容是什么?
  • 谢谢@jjanes,我已经更新了查询的完整结果(并试图找到日志。)
  • FK关系中davey1是孩子还是父母?
  • @AdrianKlaver,感谢您提出问题。 “davey1”表是父“users”表的子表(每个“user”在“users”(父)表中只有一行,对应的唯一子表是他们的“name”和唯一的“id” ”(在这种情况下为“davey1”,在下一种情况下为“greg2”,下一个用户为“shirley3”等)...这些表将包含许多特定于该用户的行。希望能回答这个问题。

标签: python postgresql flask psycopg2


【解决方案1】:

问题是只包括psycopg2-二进制==2.9.5我的需求文件中的模块......我还需要包括psycopg2==2.9.5

我不完全明白为什么,但这就是问题的解决方案(我在将我的 docker 映像部署到 AWS-ECS 并看到我的 uwsgi 进程因 psycopg2 而崩溃时发现了这一点)

感谢@AdrianKlaver 的帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-01
    • 2012-05-22
    • 1970-01-01
    • 2011-12-13
    • 1970-01-01
    • 2014-05-09
    • 1970-01-01
    相关资源
    最近更新 更多