Saya menggunakan modifikasi solusi Arturo berikut:
psql -lqt | cut -d \| -f 1 | grep -qw <db_name>
Apa yang dilakukannya
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 bahwa pencarian basis data yang disebut "Daftar," Akses "atau" baris "akan berhasil. Jadi kami menyalurkan output ini melalui sekelompok alat baris perintah bawaan untuk hanya mencari di kolom pertama.
The -t
bendera menghilangkan 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 |
karakter pipa vertikal (lolos dari shell dengan backslash), dan memilih bidang 1. Ini meninggalkan:
my_db
postgres
template0
template1
grep -w
cocok dengan seluruh kata, sehingga tidak akan cocok jika Anda mencari temp
dalam skenario ini. The -q
pilihan menekan keluaran ditulis ke layar, jadi jika Anda ingin menjalankan ini secara interaktif pada command prompt Anda mungkin dengan mengecualikan -q
jadi sesuatu akan ditampilkan segera.
Perhatikan bahwa grep -w
cocok dengan alfanumerik, angka, dan garis bawah, yang merupakan set karakter yang diperbolehkan dalam nama basis data yang tidak dikutip dalam postgresql (tanda hubung tidak legal dalam pengidentifikasi yang tidak dikutip). Jika Anda menggunakan karakter lain, grep -w
tidak akan berfungsi untuk Anda.
Status keluar dari seluruh pipa ini akan 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
... | grep 0
untuk membuat nilai pengembalian shell menjadi 0 jika DB tidak ada dan 1 jika tidak; atau... | grep 1
untuk perilaku yang berlawananwc
seluruhnya. Lihat revisi saya. (Jika Anda ingin membalikkan status keluar, Bash mendukung operator Bang:! psql ...
)wc
perintah, saya akan menggunakangrep -qw <term>
. Ini akan menyebabkan shell kembali0
jika ada kecocokan dan1
sebaliknya. Kemudian,$?
akan berisi nilai kembali dan Anda dapat menggunakannya untuk memutuskan apa yang harus dilakukan selanjutnya. Jadi, saya sarankan untuk tidak menggunakanwc
dalam hal ini.grep
akan melakukan apa yang Anda butuhkan.Kode shell berikut ini sepertinya bekerja untuk saya:
sumber
psql -U user -tAc "SELECT 1 FROM pg_database WHERE datname='DB_NAME'" template1
if [[ $(...) == 1* ]]
Ini akan mengembalikan 1 jika database yang ditentukan ada atau 0 sebaliknya.
Juga, jika Anda mencoba membuat database yang sudah ada, postgresql akan mengembalikan pesan kesalahan seperti ini:
sumber
exact_dbname_test
? Satu-satunya cara pengujian adalah mencoba terhubung ke sana.psql -l | grep doesnt_matter_what_you_grep | wc -l && echo "true"
vspsql -l | grep it_does_matter_here && echo "only true if grep returns anything"
psql -l | grep '^ exact_dbname\b'
yang menetapkan kode keluar jika tidak ditemukan.Saya baru di postgresql, tetapi perintah berikut adalah apa yang saya gunakan untuk memeriksa apakah ada basis data
sumber
psql ${DB_NAME} -c ''
.Anda dapat membuat database, jika belum ada, menggunakan metode ini:
sumber
Saya menggabungkan jawaban lain ke formulir ringkas dan POSIX yang kompatibel:
Pengembalian
true
(0
) berarti ada.Jika Anda mencurigai nama database Anda mungkin memiliki karakter non-standar seperti
$
, Anda perlu pendekatan yang sedikit lebih lama:Itu
-t
dan-A
pilihan pastikan output baku dan tidak "tabular" atau output spasi-empuk. Kolom dipisahkan oleh karakter pipa|
, sehingga haruscut
ataugrep
harus mengenali ini. Kolom pertama berisi nama basis data.EDIT: grep dengan -x untuk mencegah kecocokan nama parsial.
sumber
sumber
Untuk kelengkapan, versi lain menggunakan regex daripada memotong string:
Jadi misalnya:
sumber
\b
memiliki masalah yang sama dengan semua jawaban yang menggunakangrep -w
yaitu nama-nama database dapat berisi karakter penyusun non-kata seperti-
dan karena itu upaya untuk mencocokkanfoo
juga akan cocokfoo-bar
.jawaban yang diterima kibibu cacat karena
grep -w
akan cocok dengan nama apa pun yang mengandung pola yang ditentukan sebagai komponen kata.yaitu Jika Anda mencari "foo" maka "foo-backup" cocok.
Jawaban Otheus memberikan beberapa peningkatan yang baik, dan versi pendek akan bekerja dengan benar untuk sebagian besar kasus, tetapi semakin lama dari dua varian yang ditawarkan menunjukkan masalah yang sama dengan substring yang cocok.
Untuk mengatasi masalah ini, kita bisa menggunakan
-x
argumen POSIX untuk mencocokkan keseluruhan saja baris teks.Berdasarkan jawaban Otheus, versi yang baru terlihat seperti ini:
Itu semua mengatakan, saya cenderung mengatakan bahwa jawaban Nicolas Grilly - di mana Anda benar-benar bertanya kepada postgres tentang database spesifik - adalah pendekatan terbaik dari semua.
sumber
Solusi lain (yang fantastis) melewatkan fakta bahwa psql dapat menunggu satu menit atau lebih sebelum waktu habis jika tidak dapat terhubung ke host. Jadi, saya suka solusi ini, yang menetapkan batas waktu menjadi 3 detik:
Hal ini untuk menghubungkan ke database pengembangan resmi postgres Alpine Docker gambar.
Secara terpisah, jika Anda menggunakan Rails dan ingin mengatur database jika belum ada (seperti ketika meluncurkan wadah Docker), ini berfungsi dengan baik, karena migrasi idempoten:
sumber
psql -l|awk '{print $1}'|grep -w <database>
versi lebih pendek
sumber
Saya masih cukup berpengalaman dengan pemrograman shell, jadi jika ini benar-benar salah karena alasan tertentu, pilih saya, tetapi jangan terlalu khawatir.
Membangun dari jawaban kibibu:
sumber