2016-12-28 109 views
2

使用python 2.7.12與psycopg2版本2.6.2並沒有成功提交生成的查詢(與我剛輸入的字符串相反)。查詢AWS RedShift實例。psycopg2查詢不正確解析參數?

當我嘗試運行發生的事情是因爲添加的外來括號失敗代碼(當我使用(%s)建設...或者,如果我只使用%s而不是一個額外的單引號添加)。我試圖非常仔細地遵循文檔,並且也在這裏搜索和谷歌,但我沒有得到任何好處。有沒有人有任何建議如何解決這個問題?

我已經很努力地按照文檔在http://initd.org/psycopg/docs/usage.html#query-parametersenter image description here

我的代碼如下所示:

con = psycopg2.connect(dbname=dbname, host=host, port=port, user=user, password=password) 
cur = con.cursor() 

try3 = "TRUNCATE TABLE (%s);" 
values = ("schema_one.tbl_six",) 
cur.execute(try3,values) 

try4 = "TRUNCATE TABLE %s;" 
values = ("schema_four.tbl_four",) 
cur.execute(try4,values) 

其中產生這樣的輸出:

$ ./test_qry.py 
Traceback (most recent call last): 
    File "./test_qry.py", line 23, in <module> 
    cur.execute(try3,values) 
psycopg2.ProgrammingError: syntax error at or near "(" 
LINE 1: TRUNCATE TABLE ('schema_one.tbl_six'); 

$ ./test_qry.py 
Traceback (most recent call last): 
    File "./test_qry.py", line 28, in <module> 
    cur.execute(try4,values) 
psycopg2.ProgrammingError: syntax error at or near "'schema_four.tbl_four'" 
LINE 1: TRUNCATE TABLE 'schema_four.tbl_four'; 
+0

您使用的模式假定FIELD/VALUES對將被修改。該模式是否適用於具有FIELD/VALUE對的INSERT語句?想想也許你不能用這個範例來表達你想要的單一陳述......? –

+0

如果向下滾動,可以看到展示此範例的示例代碼:#執行命令:此操作將創建一個新表格 >>> cur.execute(「CREATE TABLE test(id serial PRIMARY KEY,num integer,data varchar) ;「) #傳遞數據以填充查詢佔位符並讓Psycopg執行 #正確的轉換(不再有SQL注入!) >>> cur.execute(」INSERT INTO test(num,data)VALUES(%s ,%s)「, ...(100,」abc'def「)) –

回答

3

你」已經得到了一個例外情況,後面將在docs

只有變量值應通過該方法的約束:它不應該被 用來設置表或字段名稱。對於這些元素,在運行execute()之前應使用普通字符串 格式。

換句話說,你不能參數表或列名並有能力使用字符串格式化

query = "TRUNCATE TABLE %s;" 
values = ("schema_one.tbl_six",) 
cur.execute(query % values) 

或者,用str.format()

query = "TRUNCATE TABLE {table_name};" 
cur.execute(query.format(table_name="schema_one.tbl_six")) 

也就是說,即使您信任,您仍然應該小心並驗證/轉義表名以防止SQL injection attacks 來源。

+0

哇!這是快速,簡潔,正確!非常感謝。 –