2013-08-22 59 views
50

我想創建一個不存在通過JDBC的數據庫。與MySQL不同,PostgreSQL不支持create if not exists語法。什麼是完成這個最好的方法?模擬CREATE DATABASE如果不存在PostgreSQL?

應用程序不知道數據庫是否存在。它應該檢查數據庫是否存在,應該使用它。因此,連接到所需的數據庫是有意義的,如果由於數據庫不存在而導致連接失敗,它應該創建新的數據庫(通過連接到默認的postgres數據庫)。我檢查了Postgres返回的錯誤代碼,但是我找不到任何相同的代碼。

實現此目的的另一種方法是連接到postgres數據庫並檢查是否存在所需數據庫並採取相應措施。第二個是有點繁瑣的工作。

有什麼辦法可以在Postgres中實現這個功能嗎?

回答

43

您可以查詢系統目錄。棘手的部分是(如已評論)CREATE DATABASE只能作爲單個語句執行。 Per documentation:

CREATE DATABASE cannot be executed inside a transaction block.

因此,它不能是一個函數或DO聲明,它會是一個事務塊裏面隱含內運行。這可以通過使用連接返回到當前數據庫的連接回避,該數據庫在事務塊之外運行。因此效果也不能回滾。

您需要安裝(每個數據庫一次)的附加模塊DBLINK:

然後:

DO 
$do$ 
BEGIN 
    IF EXISTS (SELECT 1 FROM pg_database WHERE datname = 'mydb') THEN 
     RAISE NOTICE 'Database already exists'; 
    ELSE 
     PERFORM dblink_exec('dbname=' || current_database() -- current db 
         , 'CREATE DATABASE mydb'); 
    END IF; 
END 
$do$; 

它如何工作的詳細解釋:

用Postgres測試9.3。您可以將其作爲重複使用的功能。

+0

我們該如何使用'jdbc'來編寫它,或者將它嵌入到java代碼中。 –

+1

@AmanDeepGautam:這是一個簡單的SQL語句。你應該可以像'stmt.executeQuery(query)'一樣執行它。 –

+1

不幸的是9.3(至少)不喜歡這樣:「錯誤:CREATE DATABASE不能從函數或多命令字符串執行」 –

5

我不得不使用一個擴展的版本@Erwin Brandstetter修改使用:

DO 
$do$ 
DECLARE 
    _db TEXT := 'some_db'; 
    _user TEXT := 'posrgres'; 
    _password TEXT := 'posrgres'; 
BEGIN 
    CREATE EXTENSION IF NOT EXISTS dblink; -- enable extension 
    IF EXISTS (SELECT 1 FROM pg_database WHERE datname = _db) THEN 
    RAISE NOTICE 'Database already exists'; 
    ELSE 
    PERFORM dblink_connect('host=localhost user=' || _user || ' password=' || _password || ' dbname=' || current_database()); 
    PERFORM dblink_exec('CREATE DATABASE ' || _db); 
    END IF; 
END 
$do$ 

我不得不啓用dblink擴展,再加上我不得不爲DBLINK憑據。 適用於Postgres 9.4。

64

另一個替代方案,以防萬一你想有,如果不存在,否則只是保持它,因爲它是它創建數據庫中的shell腳本:

psql -U postgres -tc "SELECT 1 FROM pg_database WHERE datname = 'my_db'" | grep -q 1 || psql -U postgres -c "CREATE DATABASE my_db" 

,我發現這是DEVOPS有幫助供應腳本,您可能希望在同一個實例上多次運行腳本。

+0

它不適合我。 'c:\ Program Files \ PostgreSQL \ 9.6 \ bin $ psql.exe -U admin -tc「SELECT 1 FROM pg_database WHERE datname ='my_db'」| grep -q 1 || psql -U admin -c「CREATE DATABASE my_db」 'grep'不被識別爲內部或外部命令, 可操作的程序或批處理文件。'我做錯了什麼? –

+0

你的路徑中沒有'grep'。在Windows上,默認情況下不安裝'grep'。您可以搜索'gnu grep windows'來查找可以在Windows上運行的版本。 – Rod

+0

Thx @Rod。在我安裝grep後,這個腳本爲我工作。 –

相關問題