我不能在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导致的?!)
我不知道如何解决这个问题,甚至进一步调试。
1条答案
按热度按时间xytpbqjk1#
问题是在我的需求文件中只包含psycopg 2-binary==2.9.5模块...我还需要包含psycopg 2 ==2.9.5
我不完全明白为什么,但这是问题的解决方案(我在将我的docker映像部署到AWS-ECS时发现了这一点,并看到我的uwsgi进程由于psycopg 2而崩溃)
感谢您发送编修。