大声的告诉我是不是被我标题中的两个“之”给带进来的??手动滑稽
需求
自己的一款软件 GitHub 地址,关于PostgreSQL 已经设置成运行后自动创建序列,表和函数,但是数据库还是要手动去创建,很不方便,想使用创建序列和表同样的方法,去自动创建数据库
过程
DDL 语句如下:
DB_NAME = """ CREATE DATABASE if not exists {}; ALTER DATABASE {} OWNER TO postgres; """.format(DATABASE_NAME, DATABASE_NAME)
发现会报一个DDL 语句语法错误
psycopg2.ProgrammingError: syntax error at or near "not" LINE 2: CREATE DATABASE if not exists test_classs;
创建序列和表的时候都没问题啊(函数我使用的是先删除,后创建),这怎么报错了?本着先运行成功,再实现功能的原则,我把“if not exists”给去掉,结果还是报错:
psycopg2.InternalError: CREATE DATABASE cannot run inside a transaction block
不能在事务块中创建数据库,大概意思就是这样不安全吧,百度加谷歌,有两种方法:
1.在 psycopg2 extensions 里使用 ISOLATION_LEVEL_AUTOCOMMIT,原理就是让连接发出命令时不启动任何事务,看常量名字,字面意思也是自动提交,并且不需要commit()或rollback()如:
import psycopg2 from psycopg2.extensions import ISOLATION_LEVEL_AUTOCOMMIT # <-- ADD THIS LINE con = psycopg2.connect(...) con.set_isolation_lev