带有Python的SQLite“表具有X列但提供了Y列”

时间:2018-08-01 23:19:33

标签: python sql sqlite

我有一个执行一些简单SQL的python脚本。

c.execute("CREATE TABLE IF NOT EXISTS simpletable (id integer PRIMARY KEY, post_body text, post_id text, comment_id text, url text);")
command = "INSERT OR IGNORE INTO simpletable VALUES ('%s', '%s', '%s', '%s')" % (comments[-1].post_body, comments[-1].post_id, comments[-1].comment_id, 
comments[-1].url)
c.execute(command)
c.commit()

但是当我执行它时,我得到一个错误

  

sqlite3.OperationalError:表simpletable有5列,但提供了4个值

为什么不自动填写id键?

3 个答案:

答案 0 :(得分:0)

如果您未指定目标列,VALUES将为所有列提供值,而您没有这样做。

INSERT
 OR IGNORE INTO simpletable
               (text,
                post_id,
                comment_id,
                text)
               VALUES ('%s',
                       '%s',
                       '%s',
                       '%s');

在任何情况下都建议指定目标列。如果由于任何原因,表中列的顺序发生变化,查询将不会中断。

答案 1 :(得分:0)

尝试指定列名称,以确保值的目的地不取决于顺序。 例如:

  

INTO simpletable                (文本,                  post_id,                  comment_id,                  文字)

如果您希望id列自动增加,请确保添加Identity属性,或类似的dbms自动增加。 例如:

  

在不存在simpletable的情况下创建表(id整数PRIMARY KEY Identity(1,1),

,请记住,您的脚本不准备更改表结构,只准备创建。

答案 2 :(得分:0)

在Python 3.6中,我如下所示进行操作,并成功插入了数据。

由于找不到None,因此我使用Null作为自动递增ID。

conn.execute("INSERT INTO CAMPAIGNS VALUES (?, ?, ?, ?)", (None, campaign_name, campaign_username, campaign_password))

ID结构如下。

ID INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL