터미널에서 psql로 PostgreSQL 간편 사용
PostgreSQL를 사용하실 때 일반적으로 데이터베이스를 보기 좋게 시각화하여 보여주는 GUI(그래픽 사용자 인터페이스) 기반 클라이언트를 이용하실텐데요. 하지만 간혹 어떤 제약 사항 때문에 이렇게 무거운 프로그램을 설치하기 어려운 상황도 생기기 마련이죠?
이런 경우 PostgreSQL에서 제공하는 CLI(명령 줄 인터페이스) 기반 클라이언트인 psql을 사용하면 매우 간편하게 터미널에서 데이터베이스에 접속할 수 있습니다.
psql 명령어 설치
psql는 PostgreSQL 데이터베이스만 설치하면 기본적으로 딸려오는 CLI 도구입니다. 만약에 컴퓨터에 PostgreSQL 데이터베이스가 이미 설치되어 있지 않으시다면 여기에서 본인 운영체제에 맞는 설치 파일을 내려받은 후 실행해주시면 됩니다.
참고로 저처럼 MacOS를 사용하시는 분들은 Homebrew를 통해서 간편하게 터미널에서 설치할 수 있습니다.
$ brew install postgresql@14
설치가 잘 되었는지 확인해보려면 터미널에서 도움말을 출력해보면 됩니다.
$ psql --help
데이터베이스 서버 접속
이제 psql을 사용할 준비가 되었으니 PostgreSQL 서버에 접속해볼까요?
PostgreSQL 서버가 현재 본인의 컴퓨터에서 돌아고 있다면 DB 이름과 사용자 이름만 있으면 되는데요.
다음과 같은 형식으로 psql 명령어를 실행할 때 DB 이름과 사용자 이름을 명시해주면 됩니다.
$ psql <DB 이름> <사용자 이름>
예를 들어, postgres라는 DB에 daleseo라는 사용자로 접속하려면 다음과 같이 명령어를 작성하시면 됩니다.
$ psql postgres daleseo
Password for user daleseo:
여기서 정확한 비밀번호를 입력하면 다음과 같이 명령 프롬프트(prompt)가 바뀌면서 데이터베이스 서버에 접속이 될 것입니다.
daleseo=#
만약에 원격이나 클라우드에 있는 데이터베이스 서버에 접속을 해야한다면 추가로 호스트(host)명과 포트(port) 번호를 명시해줘야하는데요.
다음과 같은 형식으로 -h 옵션에 호스트명을 넘기고, -p 옵션에 포트를 넘기면 됩니다.
$ psql -h <호스트명> -p <포트> <DB 이름> <사용자 이름>
예를 들어, AWS의 Amazon RDS나 Amazon Aurora에서 돌아가고 있는 PostgreSQL 서버에 접속하기 위한 명령어는 다음과 비슷한 모습일 것입니다.
$ psql -h a1b2c3.us-east-1.rds.amazonaws.com -p 5432 postgres daleseo
Password for user daleseo:
접속하려는 데이터베이스 서버가 5432 포트를 사용하고 있다면 -p 옵션은 생략해도 무방합니다.
-p 옵션을 별도로 명시하지 않으면 기본적으로 5432 포트가 사용되기 때문입니다.
참고로 DB 이름과 사용자 이름 중에 뭐가 더 먼저 나오는지 헛갈리신다면 각각의 값을 -d 옵션과 -U 옵션으로 구분해서 넘길 수도 있어요.
이렇게 해주면 아무래도 타이핑을 좀 더 해야하지만 대신 좀 더 분명하게 각각 옵션이 무엇인지 알아볼 수 있게 됩니다.
$ psql -h a1b2c3.us-east-1.rds.amazonaws.com -p 5432 -d postgres -U daleseo
Password for user daleseo:
데이터베이스 나열
하나의 PostgreSQL 서버에는 보통 한 개 이상의 데이터베이스가 구성되어 있는데요.
해당 PostgreSQL 서버 내에 존재하는 모든 데이터베이스를 나열하고 싶다면 \l 명령어를 사용하면 됩니다.
daleseo=# \l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
-----------+----------+----------+------------+------------+-----------------------
postgres | postgres | UTF8 | en_US.utf8 | en_US.utf8 |
template0 | postgres | UTF8 | en_US.utf8 | en_US.utf8 | =c/postgres +
| | | | | postgres=CTc/postgres
template1 | postgres | UTF8 | en_US.utf8 | en_US.utf8 | =c/postgres +
| | | | | postgres=CTc/postgres
(3 rows)
데이터베이스 전환
처음에 접속할 때 선택한 데이터베이스가 아닌 해당 PostgreSQL 서버 내의 다른 데이터베이스를 전환하고 싶다면 \c <디비 이름> <사용자 이름> 명령어를 사용합니다.
daleseo=# \c postgres
You are now connected to database "postgres" as user "daleseo".
postgres=#
테이블 나열
특정 데이터베이스 내에 존재하는 모든 테이블을 내열하고 싶다면 \dt 명령어를 사용합니다.
postgres=# \dt
List of relations
Schema | Name | Type | Owner
--------+--------------------+-------+----------
public | Category | table | postgres
public | Customer | table | postgres
public | CustomerOrder | table | postgres
public | OrderDetails | table | postgres
public | Product | table | postgres
public | _prisma_migrations | table | postgres
(6 rows)
참고로 뒤에 + 기호를 붙이면 좀 더 상세한 정보를 보실 수 있습니다.
postgres=# \dt+
List of relations
Schema | Name | Type | Owner | Persistence | Access method | Size | Description
--------+--------------------+-------+----------+-------------+---------------+------------+-------------
public | Category | table | postgres | permanent | heap | 8192 bytes |
public | Customer | table | postgres | permanent | heap | 8192 bytes |
public | CustomerOrder | table | postgres | permanent | heap | 0 bytes |
public | OrderDetails | table | postgres | permanent | heap | 0 bytes |
public | Product | table | postgres | permanent | heap | 8192 bytes |
public | _prisma_migrations | table | postgres | permanent | heap | 16 kB |
(6 rows)
테이블 상세 조회
특정 테이블에 대한 정보를 좀 더 상세하기 확인하고 싶다면 \d <테이블 이름> 명령어를 사용합니다.
postgres=# \d "Product"
Table "public.Product"
Column | Type | Collation | Nullable | Default
-------------+----------------+-----------+----------+---------------------------------------
id | integer | | not null | nextval('"Product_id_seq"'::regclass)
name | text | | not null |
description | text | | not null |
price | numeric(65,30) | | not null |
sku | integer | | not null |
categoryId | integer | | not null |
Indexes:
"Product_pkey" PRIMARY KEY, btree (id)
Foreign-key constraints:
"Product_categoryId_fkey" FOREIGN KEY ("categoryId") REFERENCES "Category"(id) ON UPDATE CASCADE ON DELETE RESTRICT
Referenced by:
TABLE ""OrderDetails"" CONSTRAINT "OrderDetails_productId_fkey" FOREIGN KEY ("productId") REFERENCES "Product"(id) ON UPDATE CASCADE ON DELETE RESTRICT
예제처럼 테이블 이름에 대문자가 포함되어 있는 경우에는 테이블 이름을 반드시 " 기호로 감싸줘야 하는 부분 주의 바랄께요.
SQL 쿼리 실행
psql 쉘에서는 자유롭게 SQL 쿼리 실행하여 데이터를 조회하거나 추가, 수정, 삭제할 수 있습니다.
또한 권한만 있다면 테이블이나 인덱스를 생성하거나 조작할 수도 있겠죠?
postgres=# SELECT 1;
?column?
----------
1
(1 row)
긴 쿼리는 여러 줄에 나눠서 작성할 수 있으며 맨 뒤에 ;를 붙이고 엔터를 쳐야 비로소 쿼리가 실행이 됩니다.
postgres=# SELECT * FROM "Product"
WHERE "categoryId"=1;
id | name | description | price | sku | categoryId
----+------+-------------+-------+-----+------------
(0 rows)
파일에 저장된 명령어나 쿼리 읽어오기
\i <파일 경로> 명령어를 사용하여 미리 파일에 저장해놓은 명령어나 쿼리를 한 번에 일괄로 실행할 수 있습니다.
postgres=# \o input.txt
파일에 명령어나 쿼리 실행 결과를 저장하기
\o <파일 경로> 명령어를 사용하면 명령어나 쿼리 실행 결과를 파일에 저장할 수 있습니다.
파일에 그만 저장하고 싶을 때는 \o 명령어를 한 번 더 날리면 됩니다.
postgres=# \o output.txt
postgres=# \dt
postgres=# SELECT 1;
postgres=# \o
이전에 실행한 명령어 다시 실행
바로 전에 실행한 명령어를 한 번 더 실행하려면 \g 명령어를 사용합니다.
postgres=# \g
명령어 실행 내역을 보려면 \s 명령어를 사용합니다.
postgres=# \s
데이터베이스 서버 연결 해제
마지막으로 데이터베이스의 접속을 중단하고 빠져나오고 싶을 때는 \q 명령어를 날립니다.
그러면 본래 터미널 쉘로 돌아와 명령 프롬프트(prompt)가 원래대로 돌아올 것입니다.
postgres=# \q
$
모든 명령어 확인
본 포스팅에서 다룬 명령어만 알고 계셔도 psql을 사용하시는데 큰 불폄함이 없을 것 같은데요.
그 밖에 어떤 명령어가 있는지 궁금하시다면 \? 명령어를 날려 보세요.
postgres=# \?
그러면 psql에서 사용 가능한 모든 명령어를 확인해보실 수 있을 것입니다.
마치며
이상으로 PostgreSQL에서 제공하는 CLI 기반 클라이언트인 psql을 사용하여 터미널에서 데이터베이스를 사용하는 방법에 대해서 살펴보았는데요.
psql은 PostgreSQL의 표준 콘솔 클라이언트이기 때문에 다른 범용 클라이언트에서는 사용할 수 없는 PostgreSQL 고유의 기능을 사용할 수 있다는 이점도 있습니다. 터미널 사용에 익숙하시다면 이번 기회에 PostgreSQL을 아마도 가장 빠르고 간단하게 사용할 수 있는 방법인 psql을 익혀보시를 추천드립니다.
This work is licensed under
CC BY 4.0