加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – postgres – 不能使用psycopg2删除数据库

发布时间:2020-12-16 21:28:33 所属栏目:Python 来源:网络整理
导读:所以我只是尝试使用 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
所以我只是尝试使用 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:UsersNickDocumentsGitHubCrowdSurferCrowdSurfer> 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 DB,我明确地做了.另一个连接到我想要删除的数据库(众包).请注意它是空闲的,它运行的查询是SET default_transaction_isolation TO’read committed’

所以似乎设置conn.autocommit等于true是创建一个新的进程???有什么想做什么来放弃这个数据库?

解决方法

这是发生了什么.其中一个导入的类有一个打开连接的装饰器.这是一个标准的Django装饰器transaction.atomic(我实际上错误地将它应用于类而不是方法).显然它是在导入过程中执行的,打开了与postgres DB的连接.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读