所以我只是尝试使用
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 DB,我明确地做了.另一个连接到我想要删除的数据库(众包).请注意它是空闲的,它运行的查询是SET default_transaction_isolation TO’read committed’
所以似乎设置conn.autocommit等于true是创建一个新的进程???有什么想做什么来放弃这个数据库?