2017-01-05 78 views
2

我不斷收到這個psycopg錯誤,列不存在

error: psycopg2.ProgrammingError: column "someentry" does not exist.

的錯誤,表示當someentry不是列,它只是一個進入分貝值的列someentry不存在。

下面是給出了錯誤代碼:

cur.execute('INSERT INTO {0!s} (ip_id, item) VALUES ({1!s}{2!s})'.format('mytable',1,'someentry')) 

這是我如何創建我的表:

tablename = 'mytable' 
command = """ 
      CREATE TABLE IF NOT EXISTS {} (
       ip_id SERIAL PRIMARY KEY, 
       item VARCHAR(255) NOT NULL 
     ) 
      """.format(tablename) 

cur.execute(command) 

回答

0

導致此錯誤的問題,因爲你忘了加之間的逗號{1!s}{2!s},你也沒有逃過字符串'someentry'所以postgres認爲這是一個列名稱標識符。

解決的辦法是修復語法錯誤和轉義值。這裏是做正確的方法是:

cur.execute(
    'INSERT INTO mytable (ip_id, item) VALUES (%s, %s)', 
    (1, 'someentry') 
) 

如果表名也是一個變量,因爲表名是一個標識符,你需要use extension AsIs

from psycopg2.extensions import AsIs 

cur.execute(
    'INSERT INTO %s (ip_id, item) VALUES (%s, %s)', 
    (AsIs('mytable'), 1, 'someentry') 
) 
+0

菲利普,謝謝。有效。但是,你能否通過「逃避字符串」來解釋你的意思?你所做的只是使用%s字符串格式。這是如何逃避字符串? psycopg會自動逃脫嗎? – 7alman

+0

@ 7alman:是的,您可以閱讀psycopg2的這篇文章:http://initd.org/psycopg/docs/usage.html#query-parameters –

0

你必須內使用單引號查詢。

我收到了同樣類型的錯誤,從這個

cur.execute('insert into my_table(id, name, horse_type, horse_code, horse_name) values(default, %s, 3, %s, "Mary Wonder")', [e[0], e[1]]) 

它產生

Traceback (most recent call last): 
File "process_horse.py", line 11, in <module> 
[e[0], e[1]]) 
psycopg2.ProgrammingError: column "Mary Wonder" does not exist 
LINE 2: ', "Mary Wonder") 
    ^

顯然,這是數據,而不是列名,像你說的。
當我把它改成

cur.execute("insert into my_table(id, name, horse_type, horse_code, horse_name) values(default, %s, 3, %s, 'Mary Wonder')",[e[0], e[1]]) 

它不出差錯的工作。