오늘 참한 기능 하나 알게 되어 기록을 남겨둡니다.
psql에서,
\set 명령
그냥 psql에서의 환경 설정 정보를 보거나 저장하는 기능으로만 알고 있있었는데,
이놈이 세션 단위 변수 설정이 가능하네요.
(psql 실행환경에 대한 변수 설정은 \pset 명령으로 합니다. 좀 헷갈리게 되어있네요.)
postgres=# \set
AUTOCOMMIT = 'on'
PROMPT1 = '%/%R%# '
PROMPT2 = '%/%R%# '
PROMPT3 = '>> '
VERBOSITY = 'default'
VERSION = 'PostgreSQL 9.0.5 on x86_64-unknown-linux-gnu, compiled by GCC gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-46), 64-bit'
DBNAME = 'postgres'
USER = 'postgres'
HOST = 'localhost'
PORT = '5432'
ENCODING = 'UTF8'
postgres=#
변수 지정은 늘 하는 방식 대로 \set 변수명 '변수값',
변수 사용은 :변수명
postgres=# \set
AUTOCOMMIT = 'on'
PROMPT1 = '%/%R%# '
PROMPT2 = '%/%R%# '
PROMPT3 = '>> '
VERBOSITY = 'default'
VERSION = 'PostgreSQL 9.0.5 on x86_64-unknown-linux-gnu, compiled by GCC gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-46), 64-bit'
DBNAME = 'postgres'
USER = 'postgres'
HOST = 'localhost'
PORT = '5432'
ENCODING = 'UTF8'
a = 'select version();'
postgres=# :a
version
-------------------------------------------------------------------------------------------------------------------
PostgreSQL 9.0.5 on x86_64-unknown-linux-gnu, compiled by GCC gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-46), 64-bit
(1 row)
postgres=#
윗 예제는 select version() 이라는 쿼리를 a 라는 별칭으로 지정하고 사용하는 방법입니다.
물론 세션 단위에서만 사용가능한 변수가 됩니다. psql 실행할 때마다 미리 지정하고 싶다면 .psqlrc 파일에 등록해 두면 되겠죠.
이와 함께 프로그램의 변수처럼 쿼리 안에서도 그대로 사용할 수 있는데, 값을 지정할 때, 작은 따옴표 안에 있는 모든 문자열이 변수로 그대로 대체됩니다.
postgres=# \set a 'asdf'
postgres=# select :a, now();
ERROR: column "asdf" does not exist
LINE 1: select asdf, now();
^
postgres=# \set a '''asdf'''
postgres=# select :a, now();
?column? | now
----------+------------------------------
asdf | 2011-12-28 14:22:49.47519+09
(1 row)
postgres=#
잘 쓰면 아주 유용하게 쓸 명령이네요.
해당 변수 삭제는 \unset 변수명
이왕 있는 김에 \prompt 이런 것도 하나 있었으면 좋겠건만.... 이리 생각하고 혹시나 하고 찾아보니, \prompt 명령도 이미 있었네요.
그런데, 이놈은 sql*plus 처럼 참하질 않네요.
여튼 지금까지 찾은 방법으로는 psql 실행할 때 사용하는 것 빼고는 그리 쓸모가 없어보입니다.
-bash-3.2$ cat find_table.sql
\x
\prompt 'Type table name to find: ' tb
select * from pg_class where relname = :tb;
-bash-3.2$ psql -f find_table.sql
Password:
Expanded display is on.
Type table name to find: 'pg_class'
-[ RECORD 1 ]---+--------------
relname | pg_class
relnamespace | 11
reltype | 83
reloftype | 0
relowner | 10
relam | 0
relfilenode | 0
reltablespace | 0
relpages | 7
reltuples | 253
reltoastrelid | 0
reltoastidxid | 0
relhasindex | t
relisshared | f
relistemp | f
relkind | r
relnatts | 27
relchecks | 0
relhasoids | t
relhaspkey | f
relhasexclusion | f
relhasrules | f
relhastriggers | f
relhassubclass | f
relfrozenxid | 655
relacl | {=r/postgres}
reloptions |
-bash-3.2$
문서 끝 |