Python 如何在SQLITE3上关闭和删除数据库后再次打开数据库

Python 如何在SQLITE3上关闭和删除数据库后再次打开数据库,python,python-3.x,sqlite,pyqt,pyqt5,Python,Python 3.x,Sqlite,Pyqt,Pyqt5,我创建了一个数据库,然后关闭,最后用os.remove将其删除,但是如果我尝试用同一行创建同一个数据库,然后插入一个新表,编译器会说我不能在关闭的数据库中操作。如果我添加db.open(),编译器会说它没有open属性 我尝试在另一个def上添加相同的连接线,但仍然无法在“关闭”的数据库上操作,因为很明显,我删除了该数据库,然后创建了一个新数据库。我也使用pyqt5,这就是我写“QMainWindow”的原因 一个非常常见的错误是创建具有不同作用域的同名变量,认为其中一个将替换另一个,在您的示例

我创建了一个数据库,然后关闭,最后用os.remove将其删除,但是如果我尝试用同一行创建同一个数据库,然后插入一个新表,编译器会说我不能在关闭的数据库中操作。如果我添加db.open(),编译器会说它没有open属性

我尝试在另一个def上添加相同的连接线,但仍然无法在“关闭”的数据库上操作,因为很明显,我删除了该数据库,然后创建了一个新数据库。我也使用pyqt5,这就是我写“QMainWindow”的原因


一个非常常见的错误是创建具有不同作用域的同名变量,认为其中一个将替换另一个,在您的示例中,有两个变量db:一个具有全局作用域,另一个具有函数createBase中的作用域。相反,重复使用同一个变量,也不应假设一切正常,必须在可能失败的情况下建立规则。例如,如果您调用CreateTablea超过2次,您不认为这会产生问题吗?请在尝试删除它之前检查.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_())

一个非常常见的错误是创建具有不同作用域的同名变量,认为其中一个将替换另一个,在您的示例中,有两个变量db:一个具有全局作用域,另一个具有函数createBase中的作用域。相反,重复使用同一个变量,也不应假设一切正常,必须在可能失败的情况下建立规则。例如,如果您调用CreateTablea超过2次,您不认为这会产生问题吗?请在尝试删除它之前检查.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_())

这些方法是否在您刚才没有粘贴到问题中的类中?您提供的代码不会产生您描述的错误。请提供实际产生错误的代码。在发生错误的地方添加了完整的代码。这些方法是在一个类中,而您没有粘贴到问题中?您提供的代码不会产生您描述的错误。请提供实际产生错误的代码。在发生错误的地方添加了完整代码!但我的问题是,为什么要添加
super
行??我很好奇,关于createTable def,它只是用于测试。@zemkohai读到它起作用了!但我的问题是,为什么要添加
super
行??“我很好奇,关于createTable def,它只是用来测试的。”zemkohai阅读道