我正在嘗試在 postgres 中創建一個用戶。目前正在嘗試使用https://github.com/jackc/pgx作為連接到資料庫的驅動程式。我有以下
package main
import (
"context"
"fmt"
"os"
"github.com/jackc/pgx/v4"
)
func main() {
ctx := context.Background()
conn, err := pgx.Connect(ctx, "host=localhost port=5432 user=postgres password=postgres dbname=postgres")
if err != nil {
panic(err)
}
defer conn.Close(ctx)
// create user
_, err = conn.Exec(ctx, "CREATE USER $1 WITH PASSWORD $2", "moulick", "testpass")
if err != nil {
fmt.Println(err)
os.Exit(1)
}
}
但我明白了ERROR: syntax error at or near "$1" (SQLSTATE 42601)
我不明白這里有什么問題?
uj5u.com熱心網友回復:
“我不明白這里有什么問題?” - 問題是位置引數只能用于值,不能用于識別符號。
位置引數參考用于指示從外部提供給 SQL 陳述句的值。
您不能像CREATE USER <user_name>在SELECT t.<column_name> FROM <table_name> AS t.
user_name := "moulick"
_, err = conn.Exec(ctx, "CREATE USER " user_name " WITH PASSWORD $1", "testpass")
if err != nil {
fmt.Println(err)
os.Exit(1)
}
如果user_name不是硬編碼,而是來自未知的用戶輸入,則需要自己驗證以避免 SQL 注入的可能性。這不是一項艱巨的任務,因為識別符號的詞匯結構僅限于一小組規則,如果您愿意,您可以進一步將其縮減為更小的子集(例如,不允許變音符號和非拉丁字母):
SQL 識別符號和關鍵字必須以字母(az,以及帶有變音符號和非拉丁字母的字母)或下劃線 (_) 開頭。識別符號或關鍵字中的后續字符可以是字母、下劃線、數字 (0-9) 或美元符號 ($)。請注意,根據 SQL 標準的字母,識別符號中不允許使用美元符號,因此使用它們可能會降低應用程式的可移植性。SQL 標準不會定義包含數字或以下劃線開頭或結尾的關鍵字,因此這種形式的識別符號可以避免與標準的未來擴展發生沖突。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/450155.html
標籤:sql PostgreSQL 走 pgx
