Windows下PostgreSQL 9.6.2单行创建角色失败求助
你的问题主要出在两个核心点:混淆了createuser命令行工具和SQL的CREATE USER语句,以及Windows命令行的引号规则和Linux存在差异,咱们一步步拆解清楚:
为什么你的尝试会报错?
第一次单引号包裹命令的错误:
Windows的CMD(或PowerShell)对单引号的解析逻辑和Linux不同,你执行psql -U postgres -c 'createuser my_app with createdb login password 'my_password';'时,CMD会把单引号分割的内容拆成多个独立参数,导致psql只接收到createuser这一部分,后面的with、createdb等都被当成无效的额外命令行参数忽略。另外psql默认会尝试连接和你指定的用户名同名的数据库(也就是my_app),但这个数据库还不存在,所以抛出了FATAL: database "my_app" does not exist的错误。第二次双引号包裹的错误:
createuser是PostgreSQL的独立命令行工具,不是SQL语句,而psql的-c参数是用来执行SQL命令的,所以psql会把createuser当成SQL去解析,自然会报语法错误。
正确的两种解决方法
方法一:直接使用createuser命令行工具(推荐)
createuser本身就是专门用来创建用户的独立工具,不需要通过psql执行,直接在命令行输入:
createuser -U postgres -d -l -P my_app
参数解释:
-d:允许该用户创建数据库(对应SQL中的CREATEDB)-l:允许该用户登录(对应SQL中的LOGIN)-P:交互式提示你输入密码,避免密码明文暴露在命令行历史里
如果一定要在命令行明文指定密码(不推荐,有安全风险),可以用--password参数:
createuser -U postgres -d -l --password=my_password my_app
注意:如果密码里包含特殊字符(比如!、@),需要用引号包裹密码,比如--password="my_p@ssw0rd"
方法二:用psql执行SQL的CREATE USER语句
如果你想用psql的-c参数执行SQL命令,就要用标准的CREATE USER(或CREATE ROLE)SQL语句,同时适配Windows的引号规则:
在CMD里,用双引号包裹整个SQL命令,密码用单引号:
psql -U postgres -c "CREATE USER my_app WITH CREATEDB LOGIN PASSWORD 'my_password';"
如果是PowerShell环境,需要调整引号的使用,比如用单引号包裹整个SQL命令,密码用双引号:
psql -U postgres -c 'CREATE USER my_app WITH CREATEDB LOGIN PASSWORD "my_password";'
内容的提问来源于stack exchange,提问作者Saravanabalagi Ramachandran

