【问题标题】:sqlite3.OperationalError: table A has X columns but Y values were suppliedsqlite3.OperationalError:表 A 有 X 列,但提供了 Y 值
【发布时间】:2022-01-26 13:47:51
【问题描述】:

首先,我阅读了所有类似的问题并应用了此处列出的解决方案:[1]SQLite with Python "Table has X columns but Y were supplied",[1]"Table has X columns but Y values were supplied" error3sqlite3.OperationalError: table card_data has 11 columns but 10 values were supplied,[4]sqlite3.OperationalError: table book has 6 columns but 5 values were supplied,[5] Sqlite3 Table users has 7 columns but 6 values were supplied 然而,他们都没有成功。

我正在创建 26 个表,并使用此方法成功插入数据:

im.execute("""CREATE TABLE IF NOT EXISTS C_Socket7 (Date_Requested, Time_Requested, Time_Passed, Energy_Consumption, Cumulative_Consumption, Hourly_Consumption, Daily_Consumption, Weekly_Consumption, Monthly_Consumption)""")   
string = """INSERT INTO {} VALUES ('{}','{}','{}','{}','{}','{}','{}','{}')""".format('C_'+tables[7], tstr, dict4DB['timePassed'], dict4DB['Socket7Consp'],DummyConsumptions['Cumulative'], DummyConsumptions['Hourly'], DummyConsumptions['Daily'], DummyConsumptions['Weekly'], DummyConsumptions['Monthly'])

还有这段代码:

im.execute("""CREATE TABLE IF NOT EXISTS A_Status (Time_Requested, Socket0Status, Socket1Status, Socket2Status, Socket3Status, Socket4Status, Socket5Status, Socket6Status, Socket7Status)""")
string = """INSERT INTO {} VALUES ('{}','{}','{}','{}','{}','{}','{}','{}','{}')""".format('A_'+tables[7], tstr, dict4DB['Socket0Stat'], dict4DB['Socket1Stat'],dict4DB['Socket2Stat'], dict4DB['Socket3Stat'], dict4DB['Socket4Stat'], dict4DB['Socket5Stat'], dict4DB['Socket6Stat'], dict4DB['Socket7Stat'])

但是说到这张桌子:

im.execute("""CREATE TABLE IF NOT EXISTS A_Environment (Date_Requested, Time_Requested, Voltage, Frequency, In_Temperature, In_Humidity, Ext_Temperature, Ext_Humidity, Door_Switch, Door_Relay)""")
string = """INSERT INTO A_Environment(Date_Requested, Time_Requested, Voltage, Frequency, In_Temperature, In_Humidity, Ext_Temperature, Ext_Humidity, Door_Switch, Door_Relay) VALUES ('{}','{}', '{}','{}','{}','{}','{}','{}','{}','{}')""".format(d_str, h_str, dict4DB['Voltage'], dict4DB['Frequency'],dict4DB['InTemp'], dict4DB['InHumidity'], dict4DB['ExtTemp'], dict4DB['ExtHumidity'], dict4DB['DoorSwitch'], dict4DB['DoorRelay'])

它给出了错误:

sqlite3.OperationalError: table A_Environment has 10 columns but 9 values were supplied

当我使用“DB Browser for SQLite”检查数据库时,我看不到列名。当我使用界面手动创建列时,我得到了同样的错误。

这是从 DB 浏览器查看的屏幕截图: []

当结构是这样的时候它工作正常:

im.execute("""CREATE TABLE IF NOT EXISTS A_Environment (Time_Requested, Voltage, Frequency, In_Temperature, In_Humidity, Ext_Temperature, Ext_Humidity, Door_Switch, Door_Relay)""")

string = """INSERT INTO {} VALUES ('{}','{}','{}','{}','{}','{}','{}','{}','{}')""".format('A_'+tables[6], tstr, dict4DB['Voltage'], dict4DB['Frequency'],dict4DB['InTemp'], dict4DB['InHumidity'], dict4DB['ExtTemp'], dict4DB['ExtHumidity'], dict4DB['DoorSwitch'], dict4DB['DoorRelay'])

我已将 'tstr' 更改为 'd_str' 和 'h_str',我已将日期和时间分隔到不同的列中。

我试过这些:

  1. 手动创建列。得到了同样的结果。
  2. 删除表并让它使用“CREATE TABLE IF NOT EXISTS”自行创建,它创建了表但其中也没有列。手动放置列。没用。
  3. 删除整个数据库,让它从头开始创建自己。得到了同样的结果。
  4. 我还更改了 .format() 函数中提供的值,因为 str(d_str) 和 str(h_str) 也不起作用。
  5. 我计划创建一个最小工作代码 sn-p 来查看无法读取哪个值,但在看到未创建列之后。我认为问题不在于要写入的数据。

我已阅读文档,但找不到可以使用的东西。

这是来自“DB Browser for SQLite”的表格截图 []

你有什么推荐的?我该怎么办?

PS:SQLite 在 Raspberry Pi、Rasbian OS、Python 3.7、SQLite3 上运行。

使用

【问题讨论】:

  • 永远不要使用 .format() 创建 SQL 语句。
  • 好的,解决这个问题后,我会调查它,但它与其他表一起工作正常。为什么这不起作用?我认为这可能与 rowid 有关,但其他人也一样。
  • 看我的回答。正确使用占位符也可能解决这个问题。

标签: python sqlite


【解决方案1】:

您应该永远使用.format()(或% 或f-strings)来生成SQL 语句。您的问题可能(很难说,因为我们看不到您的输入数据)源于 SQLite 错误解释的未转义值 - 实际上,您是您自己的 SQL 注入漏洞。

Instead use the placeholder system provided by your database, e.g. like this for Sqlite:

im.execute(
    """
INSERT INTO
  A_Environment(
    Date_Requested,
    Time_Requested,
    Voltage,
    Frequency,
    In_Temperature,
    In_Humidity,
    Ext_Temperature,
    Ext_Humidity,
    Door_Switch,
    Door_Relay
  )
VALUES
  (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
""",
    (
        d_str,
        h_str,
        dict4DB["Voltage"],
        dict4DB["Frequency"],
        dict4DB["InTemp"],
        dict4DB["InHumidity"],
        dict4DB["ExtTemp"],
        dict4DB["ExtHumidity"],
        dict4DB["DoorSwitch"],
        dict4DB["DoorRelay"],
    ),
)

【讨论】:

  • 好的,我正在改变一切。我会尽力让你知道。谢谢@AKX
  • 它就像一个魅力。非常感谢你,伙计!你让我免于浪费大量精力和时间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-26
  • 1970-01-01
相关资源
最近更新 更多