Python 为什么没有自动提交功能意味着所有查询都在PostgreSQL中的事务中执行?

Python 为什么没有自动提交功能意味着所有查询都在PostgreSQL中的事务中执行?,python,postgresql,psycopg2,Python,Postgresql,Psycopg2,从 PostgreSQL没有自动提交功能,这意味着 查询将在事务中执行。 在事务中执行是一件非常好的事情,它确保了数据的安全 完整性,并允许适当的错误处理。但也有 无法从事务中运行的查询。拿 下面的例子 #/usr/bin/python2.4 # # import psycopg2 # Try to connect try: conn=psycopg2.connect("dbname='template1' user='dbuser' password='mypass'") exc

PostgreSQL没有自动提交功能,这意味着 查询将在事务中执行。

在事务中执行是一件非常好的事情,它确保了数据的安全 完整性,并允许适当的错误处理。但也有 无法从事务中运行的查询。拿 下面的例子

#/usr/bin/python2.4
#
#

import psycopg2

# Try to connect

try:
    conn=psycopg2.connect("dbname='template1' user='dbuser' password='mypass'")
except:
    print "I am unable to connect to the database."

cur = conn.cursor()
try:
    cur.execute("""DROP DATABASE foo_test""")
except:
    print "I can't drop our test database!"
这段代码实际上会以打印的信息“我不能”而失败 删除我们的测试数据库!PostgreSQL无法删除一个测试数据库中的数据库 事务,它是一个全有或全无命令如果您要删除 数据库您需要更改数据库的隔离级别 这是使用以下方法完成的

conn.set_isolation_level(0)
您可以将上述内容放在DROP数据库的前面 游标执行

我想知道为什么

  • “PostgreSQL没有自动提交功能,这意味着所有查询都将在事务中执行。”

  • “PostgreSQL无法在事务中删除数据库”

  • “如果要删除数据库,则需要更改数据库的隔离级别”

谢谢


更新:
回答我的问题

所有3个都与Python及其DB连接器库相关,而不是与PostgreSQL本身相关:

  • PostgreSQL有一个
    自动提交
    ,默认情况下处于活动状态,这意味着每个SQL语句都会立即执行。启动事务块时,此自动提交模式将被禁用,直到完成事务(通过提交或回滚)
  • 销毁数据库的操作是以无法从事务块内部运行的方式实现的。还要记住,与大多数其他数据库不同,PostgreSQL允许几乎所有DDL语句(显然不是DROP数据库语句)在事务中执行
  • 实际上,如果任何人(包括您)当前连接到此数据库,则您无法删除该数据库-因此,无论您的隔离级别如何,您仍然必须连接到另一个数据库(例如,
    postgres

  • 所有3个都与Python及其DB连接器库有关,而不是与PostgreSQL本身有关:

  • PostgreSQL有一个
    自动提交
    ,默认情况下处于活动状态,这意味着每个SQL语句都会立即执行。启动事务块时,此自动提交模式将被禁用,直到完成事务(通过提交或回滚)
  • 销毁数据库的操作是以无法从事务块内部运行的方式实现的。还要记住,与大多数其他数据库不同,PostgreSQL允许几乎所有DDL语句(显然不是DROP数据库语句)在事务中执行
  • 实际上,如果任何人(包括您)当前连接到此数据库,则您无法删除该数据库-因此,无论您的隔离级别如何,您仍然必须连接到另一个数据库(例如,
    postgres

  • 谢谢从您描述的内容来看,这三点似乎都只是PostgreSQL的问题,而不是驱动程序Psycopg2。还是我遗漏了什么?谢谢。我对自动提交在postgresql和psycopg2@Tim中的含义感到困惑,我认为你所谓的“问题”只是对事情如何运作的误解。启动事务时,您可以有效地告诉数据库您希望同时执行多个查询
    ,而不是逐个执行(
    autocommit
    表示
    逐个执行
    ),谢谢。从您描述的内容来看,这三点似乎都只是PostgreSQL的问题,而不是驱动程序Psycopg2。还是我遗漏了什么?谢谢。我对自动提交在postgresql和psycopg2@Tim中的含义感到困惑,我认为你所谓的“问题”只是对事情如何运作的误解。当您启动一个事务时,您会有效地告诉数据库您希望同时执行多个查询
    ,而不是逐个执行(
    autocommit
    表示
    逐个执行