使用psycopg2创建数据库后仍提示‘数据库不存在’的问题求助
PostgreSQL数据库创建后连接失败的解决方案
问题根源
你的代码存在以下几个导致创建数据库后仍提示不存在的问题:
- 自动提交设置冲突:同时使用
set_isolation_level(ISOLATION_LEVEL_AUTOCOMMIT)和set_session(autocommit=True),会干扰DDL操作的生效逻辑。 - 多余的提交操作:在自动隔离级别下,
CREATE DATABASE属于DDL语句,不需要手动调用commit(),该操作会导致无效的事务提交。 - 异常处理逻辑缺失:仅处理
conn_consumer_expenditures的回滚,但未处理conn_postgres的异常情况,且初始值为None时会触发额外错误。
修正后的代码
import psycopg2 from psycopg2.extensions import ISOLATION_LEVEL_AUTOCOMMIT import logging import time def create_database(): conn_postgres = None conn_consumer_expenditures = None try: # 连接默认postgres数据库 conn_postgres = psycopg2.connect("dbname=postgres user=postgres password=1234") # 设置自动提交隔离级别,这是创建/删除数据库的必要条件 conn_postgres.set_isolation_level(ISOLATION_LEVEL_AUTOCOMMIT) cursor_postgres = conn_postgres.cursor() # 先删除已存在的数据库(如果有) cursor_postgres.execute("DROP DATABASE IF EXISTS CONSUMER_EXPENDITURES") # 创建目标数据库 cursor_postgres.execute("CREATE DATABASE CONSUMER_EXPENDITURES") # 关闭连接,确保数据库创建操作落地 cursor_postgres.close() conn_postgres.close() # 短暂等待数据库实例初始化 time.sleep(1) # 连接新创建的数据库 conn_consumer_expenditures = psycopg2.connect( "dbname=CONSUMER_EXPENDITURES user=postgres password=1234" ) # 根据需求设置自动提交(如果需要) conn_consumer_expenditures.set_session(autocommit=True) cursor_consumer_expenditures = conn_consumer_expenditures.cursor() return conn_consumer_expenditures, cursor_consumer_expenditures except Exception as e: # 分别处理两个连接的回滚/关闭,避免资源泄漏 if conn_postgres: try: conn_postgres.rollback() conn_postgres.close() except: pass if conn_consumer_expenditures: try: conn_consumer_expenditures.rollback() conn_consumer_expenditures.close() except: pass logging.error(msg=str(e)) # 重新抛出异常让调用方处理 raise
关键修复点说明
- 统一自动提交设置:创建/删除数据库仅需设置
ISOLATION_LEVEL_AUTOCOMMIT,无需额外调用set_session(autocommit=True)。 - 移除无效提交操作:自动提交模式下DDL语句会立即生效,手动
commit()会破坏事务逻辑。 - 完善异常处理:分别处理两个数据库连接的回滚和关闭,避免资源泄漏与额外错误。
- 优化连接流程:创建数据库后先关闭
postgres库的连接,确保数据库元数据已更新,再尝试连接新数据库。
内容的提问来源于stack exchange,提问作者Sathish Pandurangan
相关产品推荐
相关产品推荐

