Postgresql

在 PSQL 中執行一系列命令

  • December 14, 2016

我正在尋找在 PSQL 中執行多個命令的解決方案。

可以說我有一個名為2的數據庫文件。

1. slave1
2. slave2

我已經有一個名為“ master_db”的主模板。

如果我要手動執行,我將執行以下操作:

CREATE DATABASE slave1 TEMPLATE master_db;
CREATE DATABASE slave2 TEMPLATE master_db;

如果只有 2 個,那將非常容易,但在我的情況下,有 30 多個,因此我想知道我們是否可以創建一個腳本。我確實嘗試搜尋但找不到解決方案。

如果重要的話,數據庫在同一個集群中。

如果您使用的是psql9.6+,有一個非常方便的命令叫做\gexec

將目前查詢輸入緩衝區發送到伺服器,然後將查詢輸出的每一行的每一列(如果有)視為要執行的 SQL 語句。

$$ … $$生成的查詢按照返回行的順序執行,如果有多個列,則在每行內從左到右執行。NULL 欄位被忽略。生成的查詢按字面意思發送到伺服器進行處理,因此它們不能是 psql 元命令,也不包含 psql 變數引用。

因此,您的腳本可能如下所示:

SELECT format('create database slave%s template master_db', l_num) 
 FROM generate_series(1, 30) t(l_num);

\gexec

請注意psql,即使伺服器版本較低,您也可以使用較新的版本。可能會有一些罕見的不兼容情況(使用\d*命令時,因為某些系統視圖可能會在伺服器版本之間發生變化),但我還沒有見過這樣的情況。

如果您仍然停留在較早的客戶端版本上,您可以使用SELECT並將輸出手動複製到腳本文件。

如果您的數據庫名稱在一個文件中,您有多個選項。使用編輯器(類似於sed -i -e 's/^/CREATE\ DATABASE\ /' -e 's/$/\ TEMPLATE\ master_db'任何存在的作業系統sed)處理該文件,然後執行生成的腳本。

或者,您也可以執行以下操作:

CREATE TEMPORARY TABLE db_names (db text);

\copy db_names FROM 'path/to/your/file'

SELECT format('create database slave%s template master_db', db) 
 FROM db_names;

\gexec

**重要提示:**僅當您絕對信任您正在使用的源時才使用 \gexec。上述方法很容易發生SQL 注入(有趣的是,當同一行中的一個命令是 時,這並不容易CREATE DATABASE,但小心總比以後後悔好)。

引用自:https://dba.stackexchange.com/questions/158103