2014-10-01 65 views
0

我是新的python,我似乎無法弄清楚爲什麼我得到這個錯誤。它告訴我,我有太多的參數,但表中有8列,我傳遞了8個參數。到底是怎麼回事?這個錯誤可能是誤導性的,真正的問題是我試圖傳入的值可能是None,或者可能是Boolean使用%sPython:psycopg2.ProgrammingError:插入有比目標列更多的表達式

這裏是代碼片段

 db.cursor().execute("CREATE TABLE temp_clean_mp_duplicates (id bigint, distinctid character varying(255), created timestamp without time zone, email character varying(255), created_exist boolean, email_exist boolean, user_exist boolean, distinct_id_found boolean, CONSTRAINT temp_clean_mp_duplicates_pkey PRIMARY KEY(id));") 

     mp_email = None 
     email_exist = False 
     if "$email" in mp_properties : 
      mp_email = mp_properties["$email"] 
      email_exist = True 

     mp_distinct_id = result["$distinct_id"] 
     db_cursor.execute("SELECT u.id, u.email, udm.distinctid, u.sessionId FROM users as u,user_distinctid_map as udm where u.id = udm.user_id and udm.distinctid = %s and lower(email) = lower(%s)", (mp_distinct_id,mp_email,)) 
     distinct_id_found = True 
     if db_cursor.rowcount == 0 : 
      distinct_id_found = False 

     created = None 
     created_exist = False 
     if "$created" in mp_properties : 
      created = mp_properties["$created"] 
      created_exist = True 



      db_cursor.execute("SELECT u.id, u.email, u.sessionId FROM users as u where lower(u.email) = lower(%s)", (mp_email,)) 
      user_id = 0 
      user_exist = False 
      if db_cursor.rowcount > 0 : 
       user_id = db_cursor.fetchone()[0] 
       user_exist = True 

      db.cursor().execute("INSERT INTO temp_clean_mp_duplicates (id, distinctid, created, email) VALUES (%s,%s,%s,%s,%s,%s,%s,%s);", (user_id, mp_distinct_id, created, mp_email, created_exist, email_exist, user_exist, distinct_id_found)) 

回答

1

當你發現,這個問題確實是INSERT聲明:

INSERT INTO temp_clean_mp_duplicates (id, distinctid, created, email) VALUES (%s,%s,%s,%s,%s,%s,%s,%s);", (user_id, mp_distinct_id, created, mp_email, created_exist, email_exist, user_exist, distinct_id_found) 

你說得對,該有八列,但你'告訴SQL你只有設置其中四個與INSERT INTO temp_clean_mp_duplicates (id, distinctid, created, email) - 括號中的列是它將嘗試設置的列。

這是我怎麼想的INSERT語句:

INSERT INTO <tablename> (<target columns>) VALUES (<values on new row>) 

所以,如果你想將它們的所有八個,你需要把所有的列名在括號:

INSERT INTO temp_clean_mp_duplicates (id, distinctid, created, email, created_exist, email_exist, user_exist, distinct_id_found) VALUES (%s,%s,%s,%s,%s,%s,%s,%s);", (user_id, mp_distinct_id, created, mp_email, created_exist, email_exist, user_exist, distinct_id_found) 

上面的查詢應該可以工作。