【问题标题】:SQLite with Python "Table has X columns but Y were supplied"带有 Python 的 SQLite “表有 X 列,但提供了 Y”
【发布时间】:2021-08-19 05:41:10
【问题描述】:

我有一个执行一些简单 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键?

【问题讨论】:

    标签: python sql sqlite


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      在Python 3.6中我做了如下图,数据插入成功。

      我使用None 自动增加ID,因为没有找到Null

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

      ID结构如下。

      ID INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL
      

      【讨论】:

      【解决方案3】:

      尝试指定列名以确保值的目的地不依赖于顺序。 例如:

      INTO 简单表 (文本, post_id, 评论 ID, 文字)

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

      CREATE TABLE IF NOT EXISTS simpletable (id integer PRIMARY KEY Identity(1,1),

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

      【讨论】:

        【解决方案4】:

        如果您编写的代码正确,请删除您的 SQL 文件 (name.db) 并在一段时间内再次运行您的代码即可解决问题。

        想象一下这是你的代码:

        cursor.execute('''CREATE TABLE IF NOT EXISTS food(name TEXT , price TEXT)''')
        
        cursor.execute('INSERT INTO food VALUES ("burger" , "20")')
        
        connection.commit()
        

        你会看到这样的错误:

        表格有 1 列,但提供了 2 个值

        这是因为例如您创建了一个包含一列的文件,然后您将文件修改为两列,但您没有更改文件名,因此编译器不会覆盖它,因为它存在。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-01-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多