您好我正在寻找一些帮助"列表索引超出范围"我试图将数据插入我的sqlite3数据库时遇到的错误。
这是我第一次尝试使用类助手来解析数据库中的数据,所以请不要嘲笑我笨拙的编码。 :))
这是我的main.py测试我的课程。
import kivy
kivy.require('1.9.1')
from databaseHelper import DatabaseHelper
from kivy.app import App
from kivy.uix.widget import Widget
class Window1(Widget):
pass
class MyApp(App):
def build(self):
db = DatabaseHelper()
db.createDatabase('myDatabase')
columnData = ['unix', 'value', 'datestamp', 'keyword']
data = [57489543789, 2096, "12-12-12", "hello data"]
db.createTable(db.name, "datatable", columnData)
db.insertInto(db.name, "datatable", columnData, data)
return Window1()
if __name__ == '__main__':
MyApp().run()
创建数据库并创建表条目。 这是我的DatabaseHelper类中的insertInto方法。
def insertInto(self, db_name, table_name, column_data, data):
self.db_name = db_name
self.table_name = table_name
self.column_data = column_data
self.data = data
try:
conn = sqlite3.connect(self.db_name)
c = conn.cursor()
dataString = ''
string = ''
values = ''
for i in data:
string += column_data[i] + ", "
values += '?, '
dataString += 'self.data' + '[' + str(i) + ']' + ', '
string = string[0:string.__len__() - 2]
values = values[0:values.__len__() - 2]
dataString = dataString[0:dataString.__len__() - 2]
c.execute("INSERT INTO " + self.table_name + " (" + string + ")" + " VALUES " + "(" + values + ")",
"(" + dataString + ")"
)
conn.commit()
print("Succesfully input data into database: " + self.db_name + " Table: " + self.table_name)
except Exception as e:
print("Failed to input data into database: " + self.db_name + " Table: " + self.table_name)
print(e)
finally:
c.close()
conn.close()
这会导致"列表索引超出范围"错误。
非常感谢任何帮助,谢谢。
答案 0 :(得分:2)
那里有太多的字符串操作。这个insertInto
可能更接近你想要的东西:
def insertInto(self, db_name, table_name, column_data, data):
self.db_name = db_name
self.table_name = table_name
self.column_data = column_data
self.data = data
try:
conn = sqlite3.connect(self.db_name)
c = conn.cursor()
c.execute(
"INSERT INTO {table} ({columns}) VALUES ({parameters})".format(
table=table_name,
columns=', '.join(column_data),
parameters=', '.join(['?'] * len(column_data)),
),
data
)
conn.commit()
print("Succesfully input data into database: " + self.db_name + " Table: " + self.table_name)
except Exception as e:
print("Failed to input data into database: " + self.db_name + " Table: " + self.table_name)
print(e)
finally:
c.close()
conn.close()
这里的关键变化是:
str.join
所有项目,而不是在循环中连接下一个部分和分隔符,然后切掉分隔符。
以下是它的工作原理:
>>> ', '.join(['one', 'two', 'three'])
'one, two, three'
使用string formatting通过命名部分来构建字符串,而不是使用+
运算符。它更容易阅读。
使用列表乘法获取一些?
占位符。
以下是它的工作原理:
>>> ['?'] * 5
['?', '?', '?', '?', '?']
将data
作为参数传递,而不是使用文本'(data[0], data[1], …)'
的字符串。 data
也应该是一个元组:
columnData = ('unix', 'value', 'datestamp', 'keyword')
data = (57489543789, 2096, "12-12-12", "hello data")
我也不确定DatabaseHelper
应该代表什么。它有与之相关的任何州吗? self.db_name
,self.table_name
,self.column_data
,self.data
......每次插入都会覆盖它们。但是,数据库连接似乎是与数据库助手关联的有用状态:
class DatabaseHelper:
def __init__(self, db_name):
self.connection = sqlite3.connect(self.db_name, isolation_level=None)
def close(self):
self.connection.close()
def insertInto(self, table_name, columns, data):
query = "INSERT INTO {table} ({columns}) VALUES ({parameters})".format(
table=table_name,
columns=', '.join(columns),
parameters=', '.join(['?'] * len(columns))
)
self.connection.execute(query, data)
print("Succesfully input data into database: " + db_name + " Table: " + table_name)
然后你可以像这样使用它:
class MyApp(App):
def build(self):
db = DatabaseHelper('myDatabase')
columnData = ('unix', 'value', 'datestamp', 'keyword')
data = (57489543789, 2096, "12-12-12", "hello data")
db.createTable("datatable", columnData)
db.insertInto("datatable", columnData, data)
return Window1()