Python:sqlite3:列表索引超出范围

时间:2016-08-04 01:40:40

标签: python sqlite kivy

您好我正在寻找一些帮助"列表索引超出范围"我试图将数据插入我的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()

这会导致"列表索引超出范围"错误。

非常感谢任何帮助,谢谢。

1 个答案:

答案 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_nameself.table_nameself.column_dataself.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()