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

本文介绍了如何在PostgreSQL的psql命令行环境中执行SQL,包括使用-c选项执行单个或多个命令、处理特殊字符转义、结合管道符、交互式执行以及脚本单步调试。
摘要由CSDN通过智能技术生成

一、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 < exec SQL> 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 <<EOF
select * from  pg_stat_activity where query !~ 'COPY' and wait_event like '%BgWriterMain%'
EOF
 datid | datname | pid  | leader_pid | usesysid | usename | application_name | client_addr | client_hostname | client_port |         backend_start
| xact_start | query_start | state_change | wait_event_type |  wait_event  | state | backend_xid | backend_xmin | query_id | query |   backend_type
-------+---------+------+------------+----------+---------+------------------+-------------+-----------------+-------------+-------------------------------+------------+-------------+--------------+-----------------+--------------+-------+-------------+--------------+----------+-------+-------------------
       |         | 2039 |            |          |         |                  |             |                 |             | 2024-02-01 13:41:00.395458+08 |            |             |              | Activity        | BgWriterMain |       |             |              |          |       | background writer
(1 row)

三、其他执行方式(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
  • 7
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
PSQLPostgreSQL提供的一个命令行工具,用于执行SQL语句。可以使用以下命令来执行SQL语句: 1. 使用psql命令连接到PostgreSQL数据库,并执行SQL文件: ``` psql -U postgres -h localhost -p 5432 -d product -f staff.sql ``` 这个命令会连接到名为"product"的数据库,并执行名为"staff.sql"的SQL文件中的语句。 2. 如果你的SQL脚本很短,也可以使用以下方式执行: ``` psql -d postgres -c 'select version();' ``` 这个命令会连接到默认的"postgres"数据库,并执行在单引号中的SQL语句,这里的例子是执行了一个简单的"select version();"语句。 3. 如果要备份数据库,可以使用pg_dump命令: ``` pg_dump -a -t tbl_test "host=127.0.0.1 hostaddr=...psql ``` 这个命令会备份名为"tbl_test"的表,同时指定了连接数据库的相关参数。 总结起来,PSQL可以通过连接到数据库执行SQL文件或者直接在命令行中执行SQL语句来操作数据库。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [PostgreSQL 常用SQL语句](https://blog.csdn.net/qq_24794401/article/details/106626063)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [PostgreSQL数据库命令行执行SQL脚本的三种方式](https://blog.csdn.net/ma286388309/article/details/129088891)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [postgresql数据库--psql、pg_dump命令带密码执行sql语句](https://download.csdn.net/download/qq_34210939/11434593)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小怪兽ysl

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值