postgresql 使用psycopg2删除表超时(在postgres上)

ilmyapht  于 2022-12-03  发布在  PostgreSQL
关注(0)|答案(1)|浏览(256)

我不能在python中使用psycopg 2删除一个有依赖关系的表,因为它超时了。(更新以删除不相关的信息,感谢@Adrian Klaver到目前为止的帮助)。
我有两个docker映像,一个运行postgres数据库,另一个是python flask应用程序,它使用多个psycopg 2调用来创建表、插入行、选择行和(删除特定表失败)。
我尝试过的事情:

  • 使用psycopg 2选择数据、插入数据
  • 已使用psycopg 2成功删除某些表
  • 尝试(未成功)删除特定表“davey 1”(通过psycopg 2,我遇到了相同的超时问题)
  • 查看表上的锁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_required和/或访问“current_user”引起的(这两个函数都是flask_login**的一部分),在我的代码中我将它们导入为from flask_login import login_required,current_user。我不知道为什么会发生这种情况,这真的很烦人。
如果我注解掉上面的@login_required decorator,它就能正常工作,日志看起来像这样:

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时,drop表超时,我收到以下日志:

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导致的?!)
我不知道如何解决这个问题,甚至进一步调试。

xytpbqjk

xytpbqjk1#

问题是在我的需求文件中只包含psycopg 2-binary==2.9.5模块...我还需要包含psycopg 2 ==2.9.5
我不完全明白为什么,但这是问题的解决方案(我在将我的docker映像部署到AWS-ECS时发现了这一点,并看到我的uwsgi进程由于psycopg 2而崩溃)
感谢您发送编修。

相关问题