PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Periksa apakah database ada di PostgreSQL menggunakan shell

Catatan/Pembaruan (2021):Sementara jawaban ini berfungsi , secara filosofis saya setuju dengan komentar lain bahwa cara yang tepat untuk melakukan ini adalah bertanya kepada Postgres .

Periksa apakah jawaban lain yang memiliki psql -c atau --command di dalamnya lebih cocok untuk kasus penggunaan Anda (mis. Varian Nicholas Grilly, Nathan Osman, bruce, atau Pedro

Saya menggunakan modifikasi berikut dari solusi Arturo:

psql -lqt | cut -d \| -f 1 | grep -qw <db_name>

Apa fungsinya

psql -l menghasilkan sesuatu seperti berikut:

                                        List of databases
     Name  |   Owner   | Encoding |  Collate   |   Ctype    |   Access privileges   
-----------+-----------+----------+------------+------------+-----------------------
 my_db     | my_user   | UTF8     | en_US.UTF8 | en_US.UTF8 | 
 postgres  | postgres  | LATIN1   | en_US      | en_US      | 
 template0 | postgres  | LATIN1   | en_US      | en_US      | =c/postgres          +
           |           |          |            |            | postgres=CTc/postgres
 template1 | postgres  | LATIN1   | en_US      | en_US      | =c/postgres          +
           |           |          |            |            | postgres=CTc/postgres
(4 rows)

Menggunakan pendekatan naif berarti pencarian database yang disebut "Daftar, "Akses" atau "baris" akan berhasil. Jadi kami menyalurkan output ini melalui sekumpulan alat baris perintah bawaan untuk hanya mencari di kolom pertama.

-t flag menghapus header dan footer:

 my_db     | my_user   | UTF8     | en_US.UTF8 | en_US.UTF8 | 
 postgres  | postgres  | LATIN1   | en_US      | en_US      | 
 template0 | postgres  | LATIN1   | en_US      | en_US      | =c/postgres          +
           |           |          |            |            | postgres=CTc/postgres
 template1 | postgres  | LATIN1   | en_US      | en_US      | =c/postgres          +
           |           |          |            |            | postgres=CTc/postgres

Bit berikutnya, cut -d \| -f 1 membagi output dengan pipa vertikal | karakter (lolos dari shell dengan garis miring terbalik), dan memilih bidang 1. Ini meninggalkan:

 my_db             
 postgres          
 template0         
                   
 template1         
         

grep -w cocok dengan seluruh kata, dan tidak akan cocok jika Anda mencari temp dalam skenario ini. -q opsi menekan output apa pun yang ditulis ke layar, jadi jika Anda ingin menjalankan ini secara interaktif pada prompt perintah, Anda dapat mengecualikan -q jadi sesuatu segera ditampilkan.

Perhatikan bahwa grep -w cocok dengan alfanumerik, angka, dan garis bawah, yang merupakan kumpulan karakter yang diizinkan dalam nama basis data yang tidak dikutip di postgresql (tanda hubung tidak sah dalam pengidentifikasi yang tidak dikutip). Jika Anda menggunakan karakter lain, grep -w tidak akan bekerja untuk Anda.

Status keluar dari seluruh jalur pipa ini adalah 0 (berhasil) jika database ada atau 1 (gagal) jika tidak. Shell Anda akan mengatur variabel khusus $? ke status keluar dari perintah terakhir. Anda juga dapat menguji status secara langsung dalam kondisi:

if psql -lqt | cut -d \| -f 1 | grep -qw <db_name>; then
    # database exists
    # $? is 0
else
    # ruh-roh
    # $? is 1
fi


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Anotasi Kueri Boot Musim Semi dengan nativeQuery tidak berfungsi di Postgresql

  2. psql:FATAL:Otentikasi rekan gagal untuk pengembangan pengguna

  3. Pilih stempel waktu hari ini saja (sejak tengah malam)

  4. Perbarui beberapa kolom dalam fungsi pemicu di plpgsql

  5. Psycopg2 tidak suka nama tabel yang dimulai dengan huruf kecil