sqlite3崩溃" INSERT"查询(python 3)

时间:2017-04-25 14:19:41

标签: python-3.x sqlite insert crash


我有一个用Python 3.5.2构建的数据库类,我构建它可以使用其他类可以用来连接数据库的通用函数。 我正在使用SQLite和SQLite Studio来检查我的工作。 到目前为止,我已经成功创建了create-table函数,以及其他返回数据库中所有表的名称(在列表中)的函数,以及一个返回DB的任何表中所有列的名称的函数。 /> 问题:
由于某种原因,INSERT INTO方法崩溃了我的数据库(它需要一段时间,然后它说它被锁定)。它在同一个文件夹中创建一个db-journal文件,我假设它是某种日志 我已经替换了打印的执行行,以检查查询是否正常。我打印了它打印的查询并将其放入sqlite Studio的查询编辑器中,看看它们是否正常工作,并且它们正在做! 该方法使用while循环为我想要做的每个插件创建一个查询,我很确定我的方法定义有问题。它必须做一些崩溃de DB的东西(可能与内存有关吗?)

以下是代码:

    import sqlite3

class Database:
    def __init__(self, name):
        self.name=name
        self.db_conn=sqlite3.connect(self.name+'.db')
        self.cursor=self.db_conn.cursor()
        self.commit=self.db_conn.commit()
    def get_name(self):
        return self.name
    def get_tableNames(self):
        #get table names into a list:
        self.tables=[]
        c=self.db_conn.execute("select name from sqlite_master where type = 'table'")
        for row in c:
            self.tables.append(row[0])
        return self.tables
    def get_tableColumns(self,tableName):
        #get table columns into a list:
        self.tableName=tableName
        self.columns=[]
        c=self.db_conn.execute("PRAGMA table_info("+ self.tableName+" );")
        for row in c:
            self.columns.append(row[1])
        return self.columns

    def create_table(self,table_name,*args):
        #crear una tabla con nombre table_name y columns= cada uno de los argumentos de *fields.
        #cada campo de args debe ser una lista.
        self.table_name=table_name
        fields=[]
        for field in args:
            fields.append(field)
        i=0
        try:
            self.db_conn.execute("CREATE TABLE " +self.table_name+ "(ID INTEGER PRIMARY KEY AUTOINCREMENT);")
            self.commit
        except sqlite3.OperationalError:
            print("La tabla "+self.table_name+" no se ha creado")
        #añadimos las columnas a la tabla creada:
        while i<len(fields):
            if len(fields[i])==2:
                try:
                    self.db_conn.execute("ALTER TABLE "+self.table_name+" ADD COLUMN "+fields[i][0]+" "+fields[i][1].upper()+";")
                    self.commit
                    i+=1
                except sqlite3.OperationalError:
                    print("No se ha podido añadir la columna "+fields[i][0]+" a la tabla "+self.table_name)
                    i+=1
            elif len(fields[i])==3:
                try:
                    self.db_conn.execute("ALTER TABLE " +table_name+" ADD COLUMN " +fields[i][0]+" "+fields[i][1].upper()+" ("+str(fields[i][2])+") "+";")
                    self.commit
                    i+=1
                except sqlite3.OperationalError:
                    print("No se ha podido añadir la columna "+fields[i][0]+" a la tabla "+self.table_name)
                    i+=1
            else:
                print('los argumentos deben ser listas donde el primer elemento será el nombre de la columna y los otros dos, el tipo y tamaño (de haberlo)')

    def insert(self,tableName, *vals):
        #insertar valores en tabla:
        fields=self.get_tableColumns(tableName)
        rows=[]
        for row in vals:
            rows.append(row)
        r=0
        while r<len(rows):
            i=1
            query="INSERT INTO "+self.tableName+" ("
            while i<len(fields):
                query=query+str(fields[i]+',')
                i+=1
            query=query[:-1]
            query=query+') VALUES ('
            i=0
            while i<len(rows[r]):
                if type(rows[r][i]) is str:
                    query=query+str("'"+rows[r][i]+"'"+',')
                else:
                    query=query+str(rows[r][i])+','
                i+=1
            query=query[:-1]+');'
            print(query)
            print('commit')

            try:
                self.db_conn.execute(query)
                self.commit
                print("se han añadido los datos a la tabla")
            except sqlite3.OperationalError:
                print('no se han podido añadir los valores específicos a la tabla '+self.tableName)

            r+=1
            #esta función peta la DB y por eso no funcionan las queries.

    def close(self):
        self.db_conn.close()
        closed= 'database closed'
        return closed

为了使其发挥作用:

 db=Database('stock-data')
 db.create_table('test',['name','text',50],['age','integer'])
 db.insert('test',['john',20],['will',21])

最后一个表达式是崩溃的表达式。

0 个答案:

没有答案