[postgresql] 쉘을 사용하여 PostgreSQL에 데이터베이스가 있는지 확인하십시오.

셸을 사용하여 PostgreSQL 데이터베이스가 있는지 확인할 수 있는지 여부를 누군가가 말해 줄 수 있는지 궁금합니다.

쉘 스크립트를 만들고 있는데 데이터베이스가 존재하지 않지만 데이터베이스를 구현하는 방법을 볼 수 없었던 경우에만 데이터베이스를 작성하려고합니다.



답변

Arturo 솔루션의 다음 수정을 사용합니다.

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


그것이하는 일

psql -l 다음과 같은 것을 출력합니다 :

                                        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)

순진한 접근 방식을 사용한다는 것은 “목록,”액세스 “또는”행 “이라는 데이터베이스를 검색하는 것이 성공한다는 것을 의미하기 때문에이 명령을 내장 명령 줄 도구를 통해 첫 번째 열에서만 검색하도록 파이프합니다.


-t플래그는 머리글과 바닥 글을 제거합니다 :

 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

다음 비트 cut -d \| -f 1는 출력을 수직 파이프 |문자 (백 슬래시로 쉘에서 이스케이프)로 나누고 필드 1을 선택합니다.

 my_db
 postgres
 template0

 template1         

grep -w전체 단어와 일치하므로이 temp시나리오에서 검색하는 경우 일치하지 않습니다 . 이 -q옵션은 화면에 기록 된 모든 출력을 억제하므로 명령 프롬프트에서 대화식으로이를 실행하려는 경우 해당 항목을 제외하여 -q즉시 표시되도록 할 수 있습니다 .

참고 grep -w일치의 숫자, 숫자와 정확히 PostgreSQL을에 인용 부호로 둘러싸이지 않은 데이터베이스 이름에 사용할 수있는 문자의 집합입니다 밑줄 (하이픈이 인용되지 않은 식별자 법률되지 않습니다). 다른 캐릭터를 사용하는 경우 효과 grep -w가 없습니다.


이 전체 파이프 라인의 종료 상태 0는 데이터베이스가 존재하는 경우 (성공) 또는 존재 1하지 않는 경우 (실패)입니다. 쉘은 특수 변수 $?를 마지막 명령의 종료 상태로 설정합니다 . 조건부에서 직접 상태를 테스트 할 수도 있습니다.

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


답변

다음 쉘 코드가 나를 위해 작동하는 것 같습니다.

if [ "$( psql -tAc "SELECT 1 FROM pg_database WHERE datname='DB_NAME'" )" = '1' ]
then
    echo "Database already exists"
else
    echo "Database does not exist"
fi


답변

postgres@desktop:~$ psql -l | grep <exact_dbname> | wc -l

지정된 데이터베이스가 존재하면 1을, 그렇지 않으면 0을 리턴합니다.

또한 이미 존재하는 데이터베이스를 만들려고하면 postgresql은 다음과 같은 오류 메시지를 반환합니다.

postgres@desktop:~$ createdb template1
createdb: database creation failed: ERROR:  database "template1" already exists


답변

postgresql을 처음 사용하지만 다음 명령은 데이터베이스가 있는지 확인하는 데 사용한 명령입니다.

if psql ${DB_NAME} -c '\q' 2>&1; then
   echo "database ${DB_NAME} exists"
fi


답변

데이터베이스가 존재하지 않는 경우이 방법을 사용하여 데이터베이스를 작성할 수 있습니다.

if [[ -z `psql -Atqc '\list mydatabase' postgres` ]]; then createdb mydatabase; fi


답변

간결하고 POSIX 호환 양식에 대한 다른 답변을 결합하고 있습니다.

psql -lqtA | grep -q "^$DB_NAME|"

true( 0) 의 반환은 존재한다는 의미입니다.

데이터베이스 이름에와 같은 비표준 문자가있을 수 있다고 생각되면 $약간 더 긴 접근 방식이 필요합니다.

psql -lqtA | cut -d\| -f1 | grep -qxF "$DB_NAME"

-t-A옵션은 출력이 원시와 “표”또는 공백으로 채워 출력되지 않습니다 있는지 확인하십시오. 열 파이프 문자로 분리되는 |소위하거나, cut또는이 grep이를 인식한다. 첫 번째 열에는 데이터베이스 이름이 포함됩니다.

편집 : 부분 이름 일치를 방지하려면 -x를 사용하여 grep하십시오.


답변

#!/bin/sh
DB_NAME=hahahahahahaha
psql -U postgres ${DB_NAME} --command="SELECT version();" >/dev/null 2>&1
RESULT=$?
echo DATABASE=${DB_NAME} RESULT=${RESULT}
#