是否无需在任何事务中删除数据库?

时间:2018-08-16 04:28:29

标签: postgresql psycopg2

来自https://wiki.postgresql.org/wiki/Psycopg2_Tutorial

  

PostgreSQL无法在事务中删除数据库,这是全部   或没有命令。如果要删除数据库,则需要   更改数据库的隔离级别,这可以使用   正在关注。

conn.set_isolation_level(0)
     

您应将以上内容放在DROP DATABASE的紧前面   光标执行。

为什么“如果要删除数据库,则需要更改数据库的隔离级别”? 特别是为什么我们需要将隔离级别更改为0? (如果我是正确的,则0表示psycopg2.extensions.ISOLATION_LEVEL_READ_COMMITTED

来自https://stackoverflow.com/a/51859484/156458

  

销毁数据库的操作是通过以下方式实现的:   阻止撤消操作-因此您不能从内部运行它   交易,因为交易总是不可撤销的。   请注意,与大多数其他数据库不同,PostgreSQL允许几乎所有DDL   内部执行的语句(显然不是DROP DATABASE语句)   交易。

     

实际上,如果有人(包括您)   当前已连接到此数据库-因此,不管是什么   您的隔离级别,您仍然必须连接到另一个数据库   (例如postgres)

“您不能从事务内部运行它,因为事务总是不可撤消的”。那我怎么不从事务内部删除数据库呢?


我在https://stackoverflow.com/a/51880577/156458找到了答案

1 个答案:

答案 0 :(得分:1)

我不熟悉psycopg2,所以我只能提供要执行的步骤。

要从 Python 执行DROP DATABASE的步骤:

  1. 连接到您不想删除的其他数据库
  2. 将当前隔离级别存储在变量中
  3. 将隔离级别设置为0
  4. 执行DROP DATABASE查询
  5. 将隔离级别设置回原始级别(从#2开始)

要从 PSQL 执行DROP DATABASE的步骤:

  1. 连接到您不想删除的其他数据库
  2. 执行DROP DATABASE查询

psql中的代码

\c second_db
DROP DATABASE first_db;

请记住,您要删除的数据库没有实时连接。