Postgresql

在 psql -c 中執行需要標識符引用的命令

  • January 19, 2018

我創建了一個數據庫模式為“mytest.us”,在這個模式中,我創建了一個表“abc”。

當我做

select * from "mytest.us"."a.b.c";
year | mydata
------+--------
2011 | test1
2010 | test1
(2 rows)

但是當我這樣做時

\\! $TARGET/sql -p $PGPORT -d $PGDBNAME -c "select * from "mytest.us"."a.b.c"";

sh: -c: line 0: unexpected EOF while looking for matching `"'

sh: -c: line 1: syntax error: unexpected end of file

在這種情況下如何指定我的表?

濫用保留字是非常糟糕的做法。坦率地說,弄亂了多個句點.,表格/列分隔符運算符,你應該遇到任何困難。除了一些奇怪的邊緣情況外,不需要時髦的表名。無論如何,數據庫對應用程序應該是透明的,因此請堅持合理的命名。

轉義內部引號。至於如何做到這一點,取決於你的外殼。錯誤消息看起來像 *NIX shell,所以試試 backslash \"。像這樣:

"select * from \"mytest.us\".\"a.b.c\"";

首先,您使用的是外殼。所以為了安全起見,你需要引用一些東西

"$TARGET/sql" -p "$PGPORT" -d "$PGDBNAME"

Hoewver,你不想雙引號,-c否則你會得到 shell 插值,這個

-c "$foo"

可能很糟糕。然而,

-c '$foo'

很好。當您不需要變數插值時,雙引號絕不是一個好主意。你想要的是,

-c 'SELECT * FROM "mytest.us"."a.b.c";';

那會很好用,而且很安全。

所以你的最終結果是,

"$TARGET/sql" -p "$PGPORT" -d "$PGDBNAME" -c 'SELECT * FROM "mytest.us"."a.b.c";';

但我需要重申上面@vonPryz 的明智之言,

坦率地說,弄亂多個句點 .,表格/列分隔符運算符,你應該遇到任何困難。

引用自:https://dba.stackexchange.com/questions/130768