Psycopg2无法识别待删除数据库的问题求助
PostgreSQL删除数据库函数报错问题解决
问题场景
我编写了一个用于删除PostgreSQL数据库的函数:
def deleteDb(self, dbName: str): conn = psycopg2.connect(dbname="postgres", user="postgres") conn.autocommit = True curs = conn.cursor() curs.execute("DROP DATABASE {};".format(dbName)) curs.close() conn.close()
调用测试函数self.deleteDb("dbTest")时,出现如下错误:
psycopg2.errors.InvalidCatalogName: database "dbtest" does not exist
尝试过调整隔离级别、断开目标数据库的所有连接、直接连接到目标数据库,均未解决问题。
问题原因
PostgreSQL对标识符(比如数据库名)的大小写处理规则:未用双引号包裹的标识符会被自动转换为小写。你传入的数据库名是dbTest,但执行SQL时被转为了dbtest,如果实际存在的数据库是大小写混合的dbTest,就会提示找不到。
解决方案
方案1:SQL中给数据库名加双引号,保留大小写
修改执行SQL的代码,用双引号包裹数据库名,避免自动转小写:
def deleteDb(self, dbName: str): conn = psycopg2.connect(dbname="postgres", user="postgres") conn.autocommit = True curs = conn.cursor() # 用双引号包裹数据库名,保留原始大小写 curs.execute('DROP DATABASE "{}";'.format(dbName)) curs.close() conn.close()
方案2:统一使用小写数据库名
创建数据库时使用全小写名称,调用删除函数时也传入小写名称,从根源避免大小写匹配问题。
额外优化:删除前强制断开所有连接
如果目标数据库存在活跃连接,删除操作会失败,建议在删除前先断开所有连接:
def deleteDb(self, dbName: str): conn = psycopg2.connect(dbname="postgres", user="postgres") conn.autocommit = True curs = conn.cursor() # 强制断开目标数据库的所有活跃连接 curs.execute("SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = %s;", (dbName,)) # 带双引号删除数据库 curs.execute('DROP DATABASE "{}";'.format(dbName)) curs.close() conn.close()
内容的提问来源于stack exchange,提问作者Antonin
相关产品推荐
相关产品推荐

