【发布时间】:2026-02-11 01:20:02
【问题描述】:
来自https://wiki.postgresql.org/wiki/Psycopg2_Tutorial
PostgreSQL 不能在事务中删除数据库,它是一个全部 或没有命令。如果要删除数据库,则需要 更改数据库的隔离级别,这是使用 关注。
conn.set_isolation_level(0)您可以将上述内容放在 DROP DATABASE 之前 游标执行。
为什么“如果要删除数据库,则需要更改数据库的隔离级别”?
特别是,为什么我们需要将隔离级别更改为 0? (如果我是正确的,0 表示psycopg2.extensions.ISOLATION_LEVEL_READ_COMMITTED)
来自https://*.com/a/51859484/156458
销毁数据库的操作是这样实现的 防止撤消它 - 因此 您不能从内部运行它 事务,因为事务总是可撤消的。 还要保持 请注意,与大多数其他数据库不同,PostgreSQL 允许几乎所有 DDL 要在内部执行的语句(显然不是 DROP DATABASE 之一) 一笔交易。
实际上,如果任何人(包括您)是 当前连接到这个数据库 - 所以不管是什么 您的隔离级别,您仍然需要连接到另一个数据库 (例如 postgres)
“您不能从事务内部运行它,因为事务总是可撤消的”。那我怎样才能不从事务内部删除数据库呢?
【问题讨论】:
-
使用 PHP 你可以像
$db = new PDO('some other database, e.g. postgres'); $db->query('DROP DATABASE your_original_database');这样销毁数据库。我不知道如何在 Python 中做到这一点。 -
连接到不同的数据库。不要打开交易。删除你想要的数据库。
-
@KamilG。每个SQL命令默认都是一个事务,如何让一个命令不在任何事务中?
-
我敢打赌,您只需在查询执行之前和数据库更改之后执行
self.conn.set_isolation_level(0)。然后,切换回旧的隔离级别。确保事先将其存储在变量中。 -
@KamilG。您的意思是在删除数据库之前和之后两次?
标签: postgresql psycopg2