Postgresql在 psql
在 psql -c
中執行需要標識符引用的命令
我創建了一個數據庫模式為“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 的明智之言,
坦率地說,弄亂多個句點 .,表格/列分隔符運算符,你應該遇到任何困難。