【问题标题】:Python - Sqlite insert tuple without the autoincrement primary key valuePython - 没有自动增量主键值的 Sqlite 插入元组
【发布时间】:2021-11-19 02:15:47
【问题描述】:

我用主键和自动增量创建一个表。

with open('RAND.xml', "rb") as f, sqlite3.connect("race.db") as connection:
    c = connection.cursor()
    c.execute(
        """CREATE TABLE IF NOT EXISTS race(RaceID INTEGER PRIMARY KEY AUTOINCREMENT,R_Number    INT, R_KEY INT,\
        R_NAME TEXT, R_AGE INT, R_DIST TEXT, R_CLASS, M_ID INT)""")

然后我想插入一个元组,它的数量当然比总列数少 1,因为第一个是自动增量。

 sql_data = tuple(b)
    c.executemany('insert into race values(?,?,?,?,?,?,?)', b)

如何停止此错误。

sqlite3.OperationalError: table race has 8 columns but 7 values were supplied

【问题讨论】:

    标签: python sqlite


    【解决方案1】:

    来自SQLite documentation

    如果table-name 后面的column-name 列表被省略,那么每行插入的值的数量必须与表中的列数相同。

    RaceID 是表中的一列,因此当您执行 INSERT 而不明确命名列时,它应该会出现。您可以通过在该列中传递 SQLite NULL 值(在 Python 中为 None)来获得所需的行为(分配 RaceID 下一个自动增量值):

    sql_data = tuple((None,) + a for a in b)
    c.executemany('insert into race values(?,?,?,?,?,?,?,?)', sql_data)
    

    以上假设b 是您的executemany 语句的参数序列序列,并尝试将None 添加到每个子序列。根据需要修改您的代码。

    【讨论】:

      【解决方案2】:

      假定列上的特定顺序是非常糟糕的做法。一些 DBA 可能会出现并修改表,从而破坏您的 SQL 语句。其次,仅当您未在 INSERT 语句中为该字段指定值时才会使用自动增量值 - 如果您提供值,该值将存储在新行中。

      如果你修改代码来阅读

      c.executemany('''insert into
                  race(R_number, R_KEY, R_NAME, R_AGE, R_DIST, R_CLASS, M_ID)
                  values(?,?,?,?,?,?,?)''',
                  sql_data)
      

      您应该会发现一切都按预期进行。

      【讨论】:

      • 我可能稍微误导了您,因为我相信如果您尝试在主键字段中存储 NULL(因为 NULL 永远不是有效的主键),某些数据库会生成自动增量值。跨度>
      • 是的,它仍然有错误。 λ python xml_race.py Traceback(最近一次调用最后):文件“xml_race.py”,第 78 行,在 values(?,?,?,?,?,?,?)''', sql_data) sqlite3 .ProgrammingError:提供的绑定数量不正确。当前语句使用 7,提供了 6 个。将尝试在中添加一个空值
      • 该错误消息的明确含义比len(sql_data) != 7 - 你可以用print 来验证吗?
      猜你喜欢
      • 2015-12-15
      • 2019-01-09
      • 2018-05-06
      • 2012-01-05
      • 2012-02-22
      相关资源
      最近更新 更多