【问题标题】:PostgreSQL unterminated quoted identifierPostgreSQL 未终止的带引号的标识符
【发布时间】:2019-07-12 20:40:40
【问题描述】:

我有这个从命令行删除远程 postgres 架构的 groovy 代码:

def dropSchema = "psql --dbname=postgres://$user:$pass@localhost:$port/$targetDb -c \"DROP SCHEMA ${applicationName}_${uid} CASCADE;\"".execute()

这段代码在 Windows 机器上运行时运行良好,但在 Linux 发行版上运行时,出现以下错误:

psql:警告:额外的命令行参数“appName_uid”被忽略

psql:警告:额外的命令行参数“CASCADE;”被忽略

错误:""DROP" 处或附近未终止的带引号的标识符

第 1 行:“删除 ^

有谁知道如何解决这个问题?

谢谢。

【问题讨论】:

  • println "psql --dbname=postgres://$user:$pass@localhost:$port/$targetDb -c \"DROP SCHEMA ${applicationName}_${uid} CASCADE;\"" 打印出什么?
  • @tim_yates this: "psql --dbname=postgres://user:pass@localhost:port/targetDb -c "DROP SCHEMA appName_uid CASCADE;"

标签: postgresql groovy alpine


【解决方案1】:

永远不要使用带有.execute() 的字符串,例如"ls 'my fancy file'".execute()。它在 whitespace 上分裂,这很可能永远不是您想要的(与该示例中的 ["ls", "'my", "fancy", "file'"].execute() 相同)。

.execute() 也通过操作系统的常规 exec 运行命令 -- 不是 shell。因此,对于 shell 命令需要执行的引用或其他操作实际上会使事情变得更糟——因为没有涉及到解释您的意图的 shell。

改为使用数组,其中所有参数都是它们自己的(不要为 shell 引用,它从不使用

[
 "psql", 
 "--dbname=postgres://$user:$pass@localhost:$port/$targetDb", 
 "-c", "DROP SCHEMA ${applicationName}_${uid} CASCADE;"
].execute()

如果您希望重用现有的 shell 命令,请使用 shell 运行它:

["/bin/sh", "-c", "psql ... -c \"DROP ...\" ..."].execute()

这里你必须引用 shell,因为它像 shell 命令一样执行。

【讨论】:

  • 如你所说!所以他将我的命令视为参数而不是单个查询!非常感谢!
猜你喜欢
  • 2018-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多