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
    

    シェルスクリプトの使用
    スクリプトは、反復タスクを自動化するのに役立ちます.テキストファイルを作成し、ファイルにコマンドを入力し、ファイルを実行可能にし、コマンドを繰り返したい場合は、コマンドを再入力する代わりにスクリプトファイルを実行します.
    シェルスクリプトの作成と実行には次の手順があります.
  • テキストエディタを使用してスクリプトファイルを作成します
  • ファイルにコマンドを挿入します.
  • ファイルを保存して閉じます.
  • スクリプトを実行可能にします.
  • スクリプトを実行します.
  • ドロップテストDBSを作成します.以下のテキストファイルと更新
    #!/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