如何通过psql命令行直接执行指定的PostgreSQL SQL语句?
如何通过psql命令行直接传入多条SQL语句执行
嘿,这事儿其实挺容易搞定的,psql提供了好几种方式让你直接传入SQL字符串执行,不用进入交互模式。下面给你列几种常用的方法:
方法1:使用多个-c参数
每个-c参数对应一条SQL语句,逻辑清晰,也不容易因为引号嵌套出问题:
psql -U postgres -c "CREATE DATABASE myproject;" -c "CREATE USER myprojectuser WITH PASSWORD 'password';" -c "GRANT ALL PRIVILEGES ON DATABASE myproject TO myprojectuser;"
注意:这里用-U postgres是因为创建数据库和用户需要超级用户权限,你可以根据自己的实际情况替换成有权限的用户名。如果是远程连接数据库,还要加上-h 你的主机地址和-p 端口号参数。
方法2:单-c参数传入多条SQL
把所有SQL用分号分隔,放在同一个-c的字符串里,适合语句比较短的场景:
psql -U postgres -c "CREATE DATABASE myproject; CREATE USER myprojectuser WITH PASSWORD 'password'; GRANT ALL PRIVILEGES ON DATABASE myproject TO myprojectuser;"
如果你的密码里包含特殊字符(比如单引号、空格),记得要做转义处理,或者改用双引号包裹密码(但要注意shell层面的引号转义规则)。
方法3:Here-Doc方式(可读性更好)
如果SQL语句比较多或者你想排版更清晰,可以用shell的here-doc语法,这样写出来的SQL和你在编辑器里的格式一致:
psql -U postgres <<EOF CREATE DATABASE myproject; CREATE USER myprojectuser WITH PASSWORD 'password'; GRANT ALL PRIVILEGES ON DATABASE myproject TO myprojectuser; EOF
这种方式完全不用纠结引号的问题,非常适合复杂的SQL脚本。
另外要提醒一句:执行完这些命令后,你可以用psql -U myprojectuser -d myproject来测试是否能正常登录到新创建的数据库哦。
内容的提问来源于stack exchange,提问作者Santhosh




