2016-08-05 92 views
0

我想在PostgreSQL中爲表創建數據庫的腳本。 我創建deploy_db.batPSQL:當前事務中止,直到事務塊結束時忽略命令

@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 

但是,爲什麼呢?如何解決它?

+2

這個錯誤告訴你到底出了什麼問題。您不能在'BEGIN ... COMMIT'塊中運行'CREATE DATABASE'。 –

+0

哪裏需要設置塊「CREATE DATABASE」?如何正確呢? –

+0

不用在SQL腳本中創建數據庫,而是查看[createdb工具](https://www.postgresql.org/docs/current/static/app-createdb.html)。首先在您的批處理中執行它,然後連接到新創建的數據庫。 – Abelisto

回答

1

您發出的BEGIN開始了一個事務,然後CREATE DATABASE產生了錯誤信息,因爲您在事務內部運行了它。

您可以在BEGIN之前移動CREATE DATABASE語句,即可以擺脫錯誤消息。

但讀你的SQL腳本我懷疑你想在新創建的數據庫中創建新的模式和表,這不是你的腳本會發生什麼。相反,架構和表將在數據庫postgres中創建。

要改變這種狀況,你的腳本應該是這樣的:

CREATE DATABASE test; 

-- connect to that database 
\connect test 

-- now create your schema and your table 
CREATE SCHEMA ... 
CREATE TABLE ... 
相關問題