PostgreSQLで複数のデータベースを削除する方法
導入
データベースの統合テストを実行している間に、物事は南下し、私は15(15)の一時的なPostgreSQLテストデータベースを終了しました.
私の使用OmniDB , データベース管理のためのオープンソースアプリケーションOMNIDBのバージョン(3.0.2 b)は、複数のデータベースを選択して削除するためのオプションを持っていません.OmniDBでデータベースをドロップするには、データベースを右クリックし、コンテキストメニューからドロップデータベースを選択し、クエリを実行してデータベースを削除し、クエリウィンドウを閉じます.これらのテストデータベースに4つのステップを繰り返すという考えは、他の効率的な選択肢を考えるようになりました.
PostgreSQLで複数のデータベースを削除するには、次の3つの選択肢が考えられました.
pg_database
データベース使用SELECT datname FROM pg_database WHERE datname LIKE 'test%' AND datistemplate=false
SQLクエリ.SQLクエリのWHERE句は、データベース名をテストデータベースと非テンプレートデータベースに制限します.次のセクションでは、PostgreSQLで複数のデータベースを削除する際に上記の3つのオプションを調べます.
匿名コードブロック
The DO PostgreSQLのステートメントは匿名のコードブロックを実行します.過去には、匿名のコードブロックをdrop tables from a database .
DO $$
DECLARE
r RECORD;
BEGIN
FOR r IN
SELECT datname
FROM pg_database
WHERE datname LIKE 'test%' AND datistemplate=false
LOOP
EXECUTE 'DROP DATABASE ' || quote_ident(r.datname) || ';' ;
END LOOP;
END $$;
ただし、匿名コードブロックは例外をスローします.DROP DATABASE cannot be executed from a function
CONTEXT: SQL statement "DROP DATABASE test_01024da6a3;"
PL/pgSQL function inline_code_block line 12 at EXECUTE
それがわかるようにcannot execute DROP DATABASE statements inside a transaction block and anonymous code blocks being functions are transactional これが例外の理由です.
インタラクティブ端末
PostgreSQL対話型端末psql ) SQLクエリの入力、編集、実行、および結果の表示を許可します.SQLクエリに加えて、psqlはPostgreSQLサーバに送信されずにpsqlで処理されたコマンドであるメタコマンドを提供します.すべてのメタコマンドには、バックスラッシュ( prefix )があります.次の段落では、動的に
DROP DATABASE
SQLクエリを使用してクエリを実行します\gexec
メタコマンド.PostgreSQLのSQLコマンドを実行する前に、PostgreSQLサーバに接続する必要があります.PostgreSQLサーバに接続するには、
psql -d postgres
端末ウィンドウからのコマンド.ユーザ名を指定しない場合、PostgreSQLは現在のオペレーティングシステムユーザにデフォルトで設定されます.デフォルトのユーザーは、データベースの作成と削除を許可します.コマンドラインオプションをuに追加することで、別のユーザとして接続できますpsql
コマンドpsql -U username -d postgres
).接続が成功した場合
psql
プロンプトを得るpostgres=>
or postgres=#
あなたがデータベーススーパーユーザであるならば.プロンプトで、SQLクエリを構築するDROP DATABASE
ドロップするデータベースのステートメント.セミコロン()--でクエリを終了しないでください.SELECT 'DROP DATABASE ' || quote_ident(datname) || ';' FROM pg_database WHERE datname LIKE 'test%' AND datistemplate=false
. セミコロン(;)リターンキーを押すと、クエリが実行されます.The
\gexec
メタコマンドは現在の問い合わせバッファをサーバに送り、クエリの出力の各行の各列をSQL文として扱います.この場合、クエリは各テストデータベースのドロップデータベースSQLクエリを出力します.\gexec
メタコマンドは各ステートメントを出力から実行します.postgres=#
postgres=# SELECT 'DROP DATABASE ' || quote_ident(datname) || ';'
postgres=# FROM pg_database
postgres=# WHERE datname LIKE 'test%' AND datistemplate=false
postgres=#
postgres=# \gexec
シェルスクリプトの使用
スクリプトは、反復タスクを自動化するのに役立ちます.テキストファイルを作成し、ファイルにコマンドを入力し、ファイルを実行可能にし、コマンドを繰り返したい場合は、コマンドを再入力する代わりにスクリプトファイルを実行します.
シェルスクリプトの作成と実行には次の手順があります.
#!/bin/bash
test_databases_file=~/projects/test_dbs.txt
psql -d postgres -c "COPY (SELECT datname FROM pg_database WHERE datname LIKE 'test%' AND datistemplate=false) TO '$test_databases_file'"
while read dbname
do
echo "dropping DB $dbname..."
dropdb "$dbname"
done < $test_databases_file
echo "removing $test_databases_file file"
rm $test_databases_file
#!/bin/bash
は、ShebangまたはBang線と呼ばれます.コマンドを実行するインタプリタを指定します.スクリプトはpsqlを使用してPostgreSQLサーバに接続し、SQLクエリを実行してテストデータベースの名前を取得しますcopy TestSum DBSへのデータベース名.txtファイル.次に、作成したファイル(データベース名を含む)を開き、各データベース名に対してdropdb ユーティリティプログラム.最後に、データベース名を含むファイルを削除します.
スクリプトファイルを作成した後、コンソールまたはターミナルウィンドウを開き、chmodコマンドを使って実行許可をファイルに割り当てます
chmod +x drop-test-dbs.sh
).最後に、データベースを削除するには、コンソールまたはターミナルウィンドウからファイルを実行してファイル内のコマンドを実行します.
./drop-test-dbs.sh
). スクリプトファイルが現在のフォルダー内にない場合は、ファイルパスを含めてくださいfile-location/drop-test-dbs.sh
).ラッピング
PostgreSQLでは複数のデータベースを削除する方法があります.
データベースを削除するには、デスクトップまたはWebベースのデータベース管理ツールを使用することができます.いくつかのデータベース管理ツールを一度に1つのデータベースをドロップすることができます他のデータベースを削除することができます.
トランザクション内でPostgreSQLデータベースを削除することはできません.PostgreSQL関数(匿名関数を含む)はトランザクションです.
psql
はPostgreSQLと共に強力なコマンドラインツールです.使えますpsql
サーバーに接続し、データベースと対話する.使用psql
とクエリpg_database
データベースと共に必要なデータベース\gexec
メタコマンドはPostgreSQLで複数のデータベースを削除する別のオプションです.ただし、必要なデータベース用のフィルタが失敗した場合は、サーバーからすべてのデータベースを削除します.複数のデータベースを削除するタスクが繰り返している場合は、
psql
シェルスクリプトファイルにコマンドを実行し、スクリプトファイルを実行します.この投稿で説明したメソッドをテストするために複数のデータベースを作成する場合は、次のコマンドを使用してスクリプトファイルを作成して実行できます.
#!/bin/bash
for n in {1..15}
do
# Use Bash command substitution to store the
# output (GUID) from uuidgen command
DB_ID=$(uuidgen)
# Use Bash Substring expansion to extract
# 8 characters of the GUID starting from index 0
db="test_db_${DB_ID:0:8}"
createdb "$db"
echo "DB $db created"
done
Reference
この問題について(PostgreSQLで複数のデータベースを削除する方法), 我々は、より多くの情報をここで見つけました https://dev.to/kagundajm/how-to-drop-multiple-databases-in-postgresql-2pnoテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol