我创建了一个数据库,然后我关闭并最终用os.remove删除它,但是如果我尝试使用相同的行创建相同的数据库然后插入一个新表,编译器说我不能在一个封闭的数据库中操作。如果我添加db.open(),编译器会说它没有open属性。
我尝试在另一个def上添加相同的连接线但是当我明显删除它然后创建了一个新数据库时,我仍然无法在“关闭”数据库上运行。我也用pyqt5,这就是为什么我写“QMainWindow”
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow
from PyQt5 import uic
import sqlite3
import os
db = sqlite3.connect("prueba.db")
puntero = db.cursor()
#ayuda a este pobre noob que no sabe sqlite3 ni como funciona los argumentos dentro de un def()de python
class Ventana(QMainWindow):
def __init__(self):
QMainWindow.__init__(self)
uic.loadUi("base.ui",self)
self.btn_Tabla.clicked.connect(self.createTabla)
self.btn_Insertar.clicked.connect(self.createDatos)
self.btn_Borrar.clicked.connect(self.deleteBase)
self.btn_Crear.clicked.connect(self.createBase)
def createBase(self):
db = sqlite3.connect("prueba.db")
puntero = db.cursor()
self.txt_Base.setText("database created")
def createDatos(self):
x=1
def createTabla(self):
puntero.execute('''
CREATE TABLE Usuarios(id INTEGER PRIMARY KEY, Nombre TEXT,
Telefono TEXT, Correo TEXT unique, Contraseña TEXT)
''')
db.commit()
self.txt_Base.setText("tables inserted")
def deleteBase(self):
db.close()
os.remove("prueba.db")
self.txt_Base.setText("deleted database")
app = QApplication(sys.argv)
_ventana = Ventana()
_ventana.show()
app.exec_()
一个非常常见的错误是创建具有相同名称且具有不同范围的变量,认为一个将替换另一个变量,在您的情况下,您有两个变量db:一个具有全局范围,另一个具有范围在函数createBase中。相反,重用相同的变量,你不应该假设一切正常,你必须在可能失败的情况下建立规则,例如,如果你调用2次以上来创建Tabla你不认为会产生问题吗?,检查是否.db在尝试删除之前存在。
import sys
import os
import sqlite3
from PyQt5 import QtWidgets, uic
class Ventana(QtWidgets.QMainWindow):
def __init__(self):
super(Ventana, self).__init__()
uic.loadUi("base.ui",self)
self.btn_Tabla.clicked.connect(self.createTabla)
self.btn_Insertar.clicked.connect(self.createDatos)
self.btn_Borrar.clicked.connect(self.deleteBase)
self.btn_Crear.clicked.connect(self.createBase)
self.createBase()
def createBase(self):
self.db = sqlite3.connect("prueba.db")
self.puntero = self.db.cursor()
self.txt_Base.setText("database created")
def createDatos(self):
x=1
def createTabla(self):
try:
self.puntero.execute('''
CREATE TABLE IF NOT EXISTS Usuarios(id INTEGER PRIMARY KEY, Nombre TEXT,
Telefono TEXT, Correo TEXT unique, Contraseña TEXT)
''')
self.db.commit()
self.txt_Base.setText("tables inserted")
except sqlite3.ProgrammingError as e:
print("Error: ", e)
def deleteBase(self):
self.db.close()
if os.path.exists("prueba.db"):
os.remove("prueba.db")
self.txt_Base.setText("deleted database")
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
_ventana = Ventana()
_ventana.show()
sys.exit(app.exec_())