【发布时间】: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" error,3sqlite3.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',我已将日期和时间分隔到不同的列中。
我试过这些:
- 手动创建列。得到了同样的结果。
- 删除表并让它使用“CREATE TABLE IF NOT EXISTS”自行创建,它创建了表但其中也没有列。手动放置列。没用。
- 删除整个数据库,让它从头开始创建自己。得到了同样的结果。
- 我还更改了 .format() 函数中提供的值,因为 str(d_str) 和 str(h_str) 也不起作用。
- 我计划创建一个最小工作代码 sn-p 来查看无法读取哪个值,但在看到未创建列之后。我认为问题不在于要写入的数据。
我已阅读文档,但找不到可以使用的东西。
这是来自“DB Browser for SQLite”的表格截图 []
你有什么推荐的?我该怎么办?
PS:SQLite 在 Raspberry Pi、Rasbian OS、Python 3.7、SQLite3 上运行。
使用
【问题讨论】:
-
永远不要使用
.format()创建 SQL 语句。 -
好的,解决这个问题后,我会调查它,但它与其他表一起工作正常。为什么这不起作用?我认为这可能与 rowid 有关,但其他人也一样。
-
看我的回答。正确使用占位符也可能解决这个问题。