【问题标题】:insert fails in psql.exe (created from powershell)在 psql.exe 中插入失败(从 powershell 创建)
【发布时间】:2014-01-13 21:36:47
【问题描述】:

我正在从 Powershell 创建“动态”sql 语句并将其传递给 Windows 上的 PostGreSQL 服务器。

下面是代码

for ($i=1; $i -le 9; $i++)
{
$CurDate = (get-date -format "yyyy-MM-dd HH:mm:ss")
$BatchLogInsert = "Insert into `"TEMP`".`"batchLog`" (batchid, filename, status, createdate) values ('" + $NewBatchID + "','File"+$i+"','Init','"+$CurDate+"');"
write-host $BatchLogInsert

C:\PostgreSQL\9.3\bin\psql.exe -h $DBSERVER -U $DBUSER -d $CLIENTPREFIX -w -c $BatchLogInsert
}

写主机返回:

Insert into "TEMP"."batchLog" (batchid, filename, status, createdate) values ('3','File1','Init','2014-01-13 16:24:49');
Insert into "TEMP"."batchLog" (batchid, filename, status, createdate) values ('3','File2','Init','2014-01-13 16:24:49');
Insert into "TEMP"."batchLog" (batchid, filename, status, createdate) values ('3','File3','Init','2014-01-13 16:24:49');

等等。

当我在 PGAdmin 的“查询”窗口中执行这些插入时,它可以工作。但是,当我调用 psql.exe 时,它​​会说

ERROR: Relation "TEMP.batchLog" does not exist
LINE 1: Insert into TEMP.batchLog (batchid, filename, status, created...

我在这里做错了什么?


编辑:这是我的 powershell 窗口和 PgAdmin 窗口的屏幕截图...


【问题讨论】:

  • 要么您没有在psql 和 pgAdmin 中执行相同的查询,或者(更有可能)您没有连接到同一个数据库。
  • "TEMP.batchLog" "TEMP"."batchLog" 不同(可能您的 pgadmin 提交根本不包含任何引号)
  • @MilenA.Radev 我知道这似乎是错误的,但是,不知道什么是显示我正在尝试连接到正确数据库的好方法。这是我第一次使用 PostGreSql,但我遇到了似乎让简单插入正常工作的问题
  • @wildplasser 如上所述,我相信,我已经将 Powershell(写入主机)的输出运行到 PgAdmin,并且它工作正常。然而,这让我不知道要完成这样一件微不足道的事情。
  • 用反斜杠 反引号转义双引号。

标签: sql postgresql powershell


【解决方案1】:

你的双引号被Powershell吃掉了,Postgres看到一个不带引号的表名,把它折叠成小写,找不到这样的表。

正确的双引号转义似乎涉及反斜杠反引号:

$BatchLogInsert = "Insert into \`"TEMP\`".\`"batchLog\`" (...

完全避免在数据库对象名称中使用不同的大小写会更容易。

【讨论】:

  • 这成功了。谢谢。 'Insert into \"'+$Schema+'\".\"batchLog\" (batchid, filename, st...
【解决方案2】:

无论何时进行“字符串构建”,我都建议人们在 PowerShell 中使用 .NET 字符串格式。此外,使用Start-Process cmdlet 可以更轻松地将参数传递给可执行文件。

$PSql = 'C:\PostgreSQL\9.3\bin\psql.exe';

for ($i=1; $i -le 9; $i++)
{
    $CurDate = (Get-Date -Format 'yyyy-MM-dd HH:mm:ss');
    $BatchLogInsert = 'Insert into "TEMP"."batchLog" (batchid, filename, status, createdate) values (''{0}'', ''File{1}'', ''Init'', ''{2}'');' -f $NewBatchID, $i, $CurDate;
    Write-Host -Object $BatchLogInsert;

    $ArgumentList = '-h {0} -U {1} -d {2} -w -c "{3}"' -f $DBServer, $DBUser, $ClientPrefix, $BatchLogInsert;
    Start-Process -FilePath $PSql -ArgumentList $ArgumentList -Wait -NoNewWindow;
}

【讨论】:

  • 我认为这行不通,因为名称中包含大写字母的每个对象(表、视图、冒号...等)都必须被引用。您必须修改插入指令的生成。
  • @TrevorSullivan:谢谢。但是,我最终还是遇到了同样的错误。 Insert into "TEMP"."batchLog" (batchid, filename, status, createdate) values ('4', 'File1', 'Init', '2014-01-14 08:47:26' ); ERROR: relation "temp.batchlog" does not exist LINE 1: Insert into TEMP.batchLog (batchid, filename, status, created...
  • @Houari 你能分享一个例子吗?我们公司最近(并且突然)决定从 SQLServer 切换到 PostGreSQL。我们正在尝试学习它,因为我们尝试修改我们以前的脚本以迎合 SQLServer。
【解决方案3】:

您可以像 `" 那样转义嵌套的双引号,或者更好的是,使用单引号来引用字符串,然后您就不需要转义双引号。尝试替换:

 $BatchLogInsert = 'Insert into "TEMP"."batchLog" (batchid, filename, status, createdate) values (''{0}'', ''File{1}'', ''Init'', ''{2}'');' -f $NewBatchID, $i, $CurDate;

$BatchLogInsert = 'Insert into ""TEMP"".""batchLog"" (batchid, filename, status, createdate) values (''' + $NewBatchID + ''',''File'+$i.ToSTring()+''',''Init'','''+$CurDate+''');';

基于:[响应]:https://stackoverflow.com/a/11192247/1216680

【讨论】:

    猜你喜欢
    • 2021-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-13
    • 1970-01-01
    • 2023-03-30
    相关资源
    最近更新 更多