在 PSQL 中執行一系列命令
我正在尋找在 PSQL 中執行多個命令的解決方案。
可以說我有一個名為2的數據庫文件。
1. slave1 2. slave2
我已經有一個名為“
master_db
”的主模板。如果我要手動執行,我將執行以下操作:
CREATE DATABASE slave1 TEMPLATE master_db; CREATE DATABASE slave2 TEMPLATE master_db;
如果只有 2 個,那將非常容易,但在我的情況下,有 30 多個,因此我想知道我們是否可以創建一個腳本。我確實嘗試搜尋但找不到解決方案。
如果重要的話,數據庫在同一個集群中。
如果您使用的是
psql
9.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
,但小心總比以後後悔好)。