例如,我的Postgresql
数据库名称为Ajp
我无法使用此名称删除/创建数据库,即。 Ajp
我的drop脚本是
cd /D D:\\Apps
cd RSTAR PGSQL DOTCONNECT
cd bin
cd Debug
cd PG
psql -U postgres -d postgres -c "DROP DATABASE Ajp "
执行此操作时出现此错误
D:\ Apps \ RSTAR PGSQL DOTCONNECT \ bin \ Debug \ PG> psql -U postgres -d postgres -c“DR OP DATABASE Ajp“ 错误:数据库“ajp”不存在
我试过psql -U postgres -d postgres -c "DROP DATABASE 'Ajp' "
(引号内的数据库名称)
再次出现错误
错误:“'Ajp'或附近的语法错误” 第1行:DROP DATABASE'AJp'
如何解决这个问题? (请不要评论change your dbname to lower-case
)
using : "PostgreSQL 9.2.4, compiled by Visual C++ build 1600, 32-bit"
此问题的解决方案低于
\
psql -U postgres -d postgres -c "DROP DATABASE \"Ajp\";"
答案 0 :(得分:31)
区分大小写的SQL标识符需要用双引号括起来:
DROP DATABASE "Ajp";
如果您通过命令行传递它们,则不确定它们是否在Windows上正确保留。
您可能需要将其放入SQL脚本并将脚本名称传递给psql。
有关有效标识符的详细信息,请参阅手册:http://www.postgresql.org/docs/current/static/sql-syntax-lexical.html#SQL-SYNTAX-IDENTIFIERS
答案 1 :(得分:0)
这是一个老问题,但它可能会帮助其他人。 试试这个:
echo "CREATE DATABASE \\"DataBaseName\\" ;" | psql --host=xxxx.postgres.database.azure.com --port=5432 --username=xxxx@xxxx --dbname=postgres
答案 2 :(得分:0)
我相信有人会在使用 PowerShell 时遇到这个问题,这也需要反斜杠和双引号。两者都需要通过勾号转义。 (感谢 pozs)
(从 Xml 配置文件中读取)
$PSScriptRoot = Split-Path $MyInvocation.MyCommand.Path -Parent
[xml]$config = Get-Content -Path "$PSScriptRoot\Installer\Config\install.config.xml"
$securePass = Read-Host "Enter password for postgres account" -AsSecureString
$bstr = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($securePass)
$pgPass = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($bstr)
$env:PGPASSWORD = $pgPass
# Skip to here for usage:
$dropDbCmd = "DROP DATABASE IF EXISTS `\`"" + $config.Settings.dbName + "`\`";"
.\psql.exe -c $dropDbCmd -d "postgres" -p $config.Settings.dbPort -U "postgres"