如何在PostgreSQL命令行查询中正确转义字符?附报错排查
问题解决与优化方案
报错原因与修正
你执行的SQL里WHERE usename LIKE name存在两个问题:
pg_catalog.pg_user表没有名为name的列,正确的用户名列是usename- 如果是要匹配特定用户名,需要把
name换成带单引号的字符串;如果要匹配当前会话用户,用内置变量current_user
修正后的示例命令
- 查询用户名包含
postgres的用户:
[servername]# su postgres -c 'psql -c "SELECT * FROM pg_catalog.pg_user WHERE usename LIKE '%postgres%';"'
- 查询当前登录的数据库用户:
[servername]# su postgres -c 'psql -c "SELECT * FROM pg_catalog.pg_user WHERE usename = current_user;"'
更优雅的命令行查询方式
1. 简化su调用(无需cd)
cd ~是多余的,postgres用户默认家目录已经适配psql,直接执行即可:
su postgres -c 'psql -c "SELECT * FROM pg_catalog.pg_user;"'
2. 直接用psql的-U参数(无需su,需权限配置)
如果你的系统用户有权限以postgres身份连接数据库,可以跳过su,直接用:
psql -U postgres -c "SELECT * FROM pg_catalog.pg_user WHERE usename LIKE '%test%';"
3. 多行SQL更易读(用HEREDOC)
对于复杂查询,用HEREDOC可以避免引号嵌套的麻烦,格式更清晰:
su postgres -c 'psql <<EOF SELECT usename, usesysid, passwd FROM pg_catalog.pg_user WHERE usename NOT LIKE 'postgres'; EOF'
4. 格式化输出
- 无表头纯文本输出(适合脚本处理):
su postgres -c 'psql -c "SELECT usename FROM pg_catalog.pg_user;" -A -t'
- 展开式输出(每行显示一个字段):
su postgres -c 'psql -c "SELECT * FROM pg_catalog.pg_user WHERE usename = current_user;" -x'
内容的提问来源于stack exchange,提问作者palmasd1
相关产品推荐
相关产品推荐

