gpt4 book ai didi

python - postgres - 无法使用 psycopg2 删除数据库

转载 作者:太空狗 更新时间:2023-10-30 01:22:29 25 4
gpt4 key购买 nike

所以我只是尝试使用 Python 的 psycopg2 删除并重新创建我的数据库。这是我的代码:

    with psycopg2.connect(database="postgres", user="postgres", password="****") as conn:
with conn.cursor() as cur:
conn.autocommit = True # Explains why we do this - we cannot drop or create from within a DB transaction. http://initd.org/psycopg/docs/connection.html#connection.autocommit
cur.execute("DROP DATABASE crowdsurfer;")
cur.execute("CREATE DATABASE crowdsurfer;")

当我运行这段代码时,我得到了

PS C:\Users\Nick\Documents\GitHub\CrowdSurfer\CrowdSurfer> python utils/sqlInit.py
Traceback (most recent call last):

File "utils/sqlInit.py", line 70, in <module>
run()

File "utils/sqlInit.py", line 21, in run
recreate_empty_database()

File "utils/sqlInit.py", line 40, in recreate_empty_database
cur.execute("DROP DATABASE crowdsurfer;")

psycopg2.OperationalError: database "crowdsurfer" is being accessed by other users
DETAIL: There is 1 other session using the database.

好吧,很公平。因此,我打开了一个与 postgres 的连接,并在我的代码运行之前和运行期间查看了现有的处理过程。在我的代码开始之前,我们得到这个:

postgres=# select pid from pg_stat_activity

此命令返回单个 PID,PID 6052

这个过程就是我,所以很好。现在这是我在运行 python 代码时查询运行进程时得到的结果:

 postgres=# select * from pg_stat_activity;
datid | datname | pid | usesysid | usename | application_name | client_addr | client_hostname | client_port | backend_start | xact_start | query_start |
state_change | waiting | state | query

12029 | postgres | 6052 | 10 | postgres | psql | ::1 | | 49842 | 2014-03-11 23:14:34.049-06 | 2014-03-11 23:14:58.938-06 | 2014-03-11 23:14:58.938-06 |

2014-03-11 23:14:58.938-06 | f | active | select * from pg_stat_activity;
142547 | crowdsurfer | 3952 | 10 | postgres | | 127.0.0.1 | | 49849 | 2014-03-11 23:14:57.489-06 | | 2014-03-11 23:14:57.491-06 |
2014-03-11 23:14:57.491-06 | f | idle | SET default_transaction_isolation TO 'read committed'

12029 | postgres | 7908 | 10 | postgres | | ::1 | | 49851 | 2014-03-11 23:14:57.556-06 | 2014-03-11 23:14:57.559-06 | 2014-03-11 23:14:57.559-06 |
2014-03-11 23:14:57.559-06 | f | active | DROP DATABASE crowdsurfer;
(3 rows)

python代码启动了2个进程!一个连接到 postgres 数据库,我明确地这样做了。另一个连接到我要删除的数据库 (crowdsurfer)。注意它是空闲的,它运行的查询是 SET default_transaction_isolation TO 'read committed'

所以似乎将 conn.autocommit 设置为 true 是在创建一个新进程???关于在这里做什么来删除这个数据库有什么想法吗?

最佳答案

事情是这样的。其中一个导入的类有一个打开连接的装饰器。这是一个标准的 Django 装饰器 transaction.atomic(我实际上错误地将它应用于类而不是方法)。显然它是在导入过程中执行的,打开到 postgres 数据库的连接。

关于python - postgres - 无法使用 psycopg2 删除数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22357856/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com