【PostgreSQL灵活使用psql执行SQL的一些方式】

一、psql执行SQL并使用选项灵活输出结果

可以不进入数据库,在命令行,使用psql 的-c选项跟上需要执行的SQL。来获取SQL的执行结果

postgres@ubuntu-linux-22-04-desktop:~$ psql -c "select 1,2" 
 ?column? | ?column?
----------+----------
        1 |        2
(1 row)

//同一个 -c的引号里是同一个事务,多个-c分别是不同的事物

postgres@ubuntu-linux-22-04-desktop:~$ psql -c "select txid_current(); select txid_current();" -c "select txid_current();"
 txid_current
--------------
         1865
(1 row)

 txid_current
--------------
         1865
(1 row)

 txid_current
--------------
         1866
(1 row)

可以使用psql的选项对查询结果进行一些处理

//-A设置非对齐输出模式,加上-A后输出格式变得不对齐了,并且返回结果中没有空行
postgres@ubuntu-linux-22-04-desktop:~$ psql -c "select 1,2" -A
?column?|?column?
1|2
(1 row)

// -t只显示数据,不显示表头和返回行数,但是有空行
postgres@ubuntu-linux-22-04-desktop:~$ psql -c "select 1,2" -t
        1 |        2

//-t和-A两个同时加,则没有空行,非对齐输出
postgres@ubuntu-linux-22-04-desktop:~$ psql -c "select 1,2" -tA
1|2

//可以使用-F更改分割符
postgres@ubuntu-linux-22-04-desktop:~$ psql -c "select 1,2" -tA -F ,
1,2

//-q不显示输出信息。默认情况下psql执行命令是会返回多种信息,使用-q参数后将不显示这些信息
//-q选项通常和-c和-f一起使用,在维护操作中非常有用,当输出信息不重要时,这个特性非常重要
 

二、特殊字符转义问题

有时候如果想执行的SQL涉及到一些特殊字符,原本的-c可能执行涉及到转义的问题,这种情况,可以借助psql< EOF这种来避免特殊字符转义问题。

postgres@ubuntu-linux-22-04-desktop:~$ psql -c "select * from  pg_stat_activity where query !~ 'COPY' and wait_event like '%BgWriterMain%'"
-bash: !~: event not found

postgres@ubuntu-linux-22-04-desktop:~$ psql <

三、其他执行方式(psql结合管道符和echo)

postgres@ubuntu-linux-22-04-desktop:~$  echo '\encoding SQL-ASCII \\ SELECT relname, relnamespace FROM pg_class LIMIT 1;' | psql
   relname    | relnamespace
--------------+--------------
 pg_statistic |           11
(1 row)

postgres@ubuntu-linux-22-04-desktop:~$ echo 'SELECT relname, relnamespace FROM pg_class LIMIT 1;'  'select txid_current();' 'select txid_current();'|psql
   relname    | relnamespace
--------------+--------------
 pg_statistic |           11
(1 row)

 txid_current
--------------
         1861
(1 row)

 txid_current
--------------
         1862
(1 row)



//如果使用这种方式显式开启了事务,需要最后加上一个commit来提交事务,否则事务不会自动提交,执行之后自动回滚。

postgres@ubuntu-linux-22-04-desktop:~$ echo 'begin;' 'select * from tab_test_1;' 'select txid_current();' 'insert into tab_test_1 values(1);' 'select txid_current();'|psql
BEGIN
 id
----
(0 rows)

 txid_current
--------------
         1893
(1 row)

INSERT 0 1
 txid_current
--------------
         1893
(1 row)

postgres@ubuntu-linux-22-04-desktop:~$ psql -c "select * from tab_test_1"
 id
----
(0 rows)

postgres@ubuntu-linux-22-04-desktop:~$ echo 'begin;' 'select * from tab_test_1;' 'select txid_current();' 'insert into tab_test_1 values(1);' 'select txid_current();' 'commit'|psql
BEGIN
 id
----
(0 rows)

 txid_current
--------------
         1894
(1 row)

INSERT 0 1
 txid_current
--------------
         1894
(1 row)

COMMIT
postgres@ubuntu-linux-22-04-desktop:~$ psql -c "select * from tab_test_1"
 id
----
  1
(1 row)

四、交互式执行SQL或者脚本,逐步检查

执行SQL或者SQL脚本时候带上 --single-step或者-s 选项,可以交互式地运行它,同时逐行检查 SQL 文件的内容。这对于脚本调试和演示很有用。

回车表示执行SQL,x表示不执行SQL。

交互单步执行SQL,每一个-c 相当于一步

postgres@ubuntu-linux-22-04-desktop:~$ psql -c "select 1" -c "select 2" -s
***(Single step mode: verify command)*******************************************
select 1
***(press return to proceed or enter x and return to cancel)********************

 ?column?
----------
        1
(1 row)

***(Single step mode: verify command)*******************************************
select 2
***(press return to proceed or enter x and return to cancel)********************
x

交互单步执行SQL脚本。

postgres@ubuntu-linux-22-04-desktop:~$ cat check.sql
select 1;
select now();
select 2;
select now();

postgres@ubuntu-linux-22-04-desktop:~$ psql -s -f check.sql
***(Single step mode: verify command)*******************************************
select 1;
***(press return to proceed or enter x and return to cancel)********************

 ?column?
----------
        1
(1 row)

***(Single step mode: verify command)*******************************************
select now();
***(press return to proceed or enter x and return to cancel)********************

              now
-------------------------------
 2024-02-01 14:39:40.523424+08
(1 row)

***(Single step mode: verify command)*******************************************
select 2;
***(press return to proceed or enter x and return to cancel)********************
x
***(Single step mode: verify command)*******************************************
select now();
***(press return to proceed or enter x and return to cancel)********************
x

你可能感兴趣的:(PostgreSQL,postgresql,sql,数据库)