【问题标题】:How to open again a database after being closed and deleted on SQLITE3在 SQLITE3 上关闭和删除后如何再次打开数据库
【发布时间】:2019-08-16 04:33:33
【问题描述】:

我创建了一个数据库,然后我关闭并最终使用 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_()

【问题讨论】:

  • 这些方法是否在您刚刚未粘贴到问题中的类中?
  • 您提供的代码不会产生您描述的错误。请提供实际产生错误的代码。
  • 在发生的地方添加了完整的代码

标签: python python-3.x sqlite pyqt pyqt5


【解决方案1】:

一个非常常见的错误是创建具有不同范围的同名变量,认为一个会替换另一个,在您的情况下,您有 2 个变量 db:一个具有全局范围,另一个具有函数 createBase 中的范围。相反,重用相同的变量,而且你不应该假设一切正常,你必须建立规则以防万一,例如,如果你调用超过 2 次 createTabla,你不认为这会产生问题吗?,检查是否.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_())

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多