【问题标题】:Python: psycopg2.ProgrammingError:INSERT has more expressions than target columnsPython:psycopg2.ProgrammingError:INSERT 的表达式多于目标列
【发布时间】:2014-10-01 01:10:17
【问题描述】:

我是 python 新手,我似乎无法弄清楚为什么会出现此错误。它告诉我我有太多参数但是表有 8 列,我传递了 8 个参数。到底是怎么回事?这个错误是否会产生误导,真正的问题是我试图使用%s 传递可能是NoneBoolean 类型的值?

这里是代码sn-p

        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))

【问题讨论】:

    标签: python sql psycopg2 psql


    【解决方案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)
    

    您是对的,table 有八列,但您告诉 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)
    

    上面的查询应该可以工作。

    【讨论】:

      猜你喜欢
      • 2019-08-15
      • 1970-01-01
      • 2021-12-20
      • 1970-01-01
      • 2017-04-20
      • 2015-02-22
      • 2020-09-17
      • 2020-01-19
      相关资源
      最近更新 更多