我有一个用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])
最后一个表达式是崩溃的表达式。