【发布时间】:2016-12-11 23:42:02
【问题描述】:
我想为在 PostgreSQL 中创建包含表的数据库编写脚本。 我创建了 deploy_db.bat:
@echo off
"C:\Program Files\PostgreSQL\9.4\bin\psql.exe" -h localhost -p 5433 -U postgres -d postgres -f run_main.sql
pause
我的 run_main.sql:
BEGIN;
\i create_db.sql
\i tableA.sql
COMMIT;
create_db.sql:
CREATE DATABASE test;
DROP SCHEMA IF EXISTS test CASCADE;
CREATE SCHEMA test
AUTHORIZATION postgres;
tableA.sql:
CREATE TABLE test.tableA(
id serial PRIMARY KEY,
name text,
age INTEGER
);
所以,我运行 deploy_db.bat 并查看:
BEGIN
psql:create_db.sql:1: ERROR: CREATE DATABASE cannot run inside a transaction block
psql:create_db.sql:3: ERROR: current transaction is aborted, commands ignored until end of transaction block
ROLLBACK
但是,为什么?怎么解决?
【问题讨论】:
-
错误告诉你究竟出了什么问题。您不能在
BEGIN ... COMMIT块内运行CREATE DATABASE。 -
哪里需要设置块“CREATE DATABASE”?怎么正确呢?
-
不要在 SQL 脚本中创建数据库,而是查看 createdb utility。首先在您的批处理中执行它,然后连接到新创建的数据库。
-
@Abelisto 或者只运行
CREATE DATABASE在BEGIN之前。然后你可能想\c到创建的数据库。 -
@CraigRinger 是的,它是在您上面的评论和下面的答案中提出的。然而,在我自己的看来,创建数据库和用对象/数据填充它有点不同(比如格式化软盘并将文件复制到它:) 此外,虽然在 Q 中提到了 @987654332 @,并非所有客户端都支持在同一脚本中“即时”连接到另一个数据库。最后,分离这些操作允许在不同名称的数据库中创建数据模式,而无需编辑 SQL 脚本。简而言之,这就是我建议单独创建数据库的原因。
标签: java postgresql batch-file psql