PostgreSQL不加引号的标识符

时间:2019-07-12 10:21:24

标签: postgresql groovy alpine

我有这个时髦的代码,可从命令行删除远程postgres模式:

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行:“ DROP           ^

有人知道如何解决此问题吗?

谢谢。

1 个答案:

答案 0 :(得分:3)

永远不要像let arr = ["2019-07-12 12:43:00", "2019-07-09 12:57:35", "2019-07-09 12:04:33", "2019-07-05 14:32:32", "2019-07-04 17:50:23", "2019-07-02 12:12:30", "2019-07-01 18:09:28"] let result = arr.compactMap({ $0.components(separatedBy: " ").first }) 那样使用带有.execute()的字符串。它在空白上分割,并且很可能永远不会是您想要的(对于该示例,与"ls 'my fancy file'".execute()相同)。

["ls", "'my", "fancy", "file'"].execute()通过操作系统的常规.execute()运行命令-不是外壳程序。因此,引用或其他操作,对于shell命令来说,实际上会使情况变得更糟-因为不涉及任何shell来解释您的意图。

代替使用数组,所有参数都是它们自己的数组(不要引用shell,从不使用

exec

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

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

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