Как снова открыть базу данных после закрытия и удаления на SQLITE3 - PullRequest
1 голос
/ 25 марта 2019

Я создаю базу данных, затем закрываю и окончательно удаляю ее с помощью os.remove, но если я пытаюсь создать ту же базу данных с той же строкой, а затем вставляю новую таблицу, компилятор говорит, что я не может работать в закрытая база данных . Если я добавлю db.open (), компилятор скажет, что не имеет открытого атрибута .

Я попытался добавить ту же строку подключения в другое определение, но я все еще не могу работать с «закрытой» базой данных, когда очевидно, что я удалил ее, а затем создал новую базу данных. Я тоже использую 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_()

1 Ответ

0 голосов
/ 26 марта 2019

Очень распространенной ошибкой является создание переменных с одинаковыми именами, которые имеют разные области действия, думая, что одна заменит другую, в вашем случае у вас есть 2 переменные db: одна с глобальной областью видимости, а другая с областью видимости в функции createBase. Вместо этого повторно используйте ту же переменную. Также не следует предполагать, что все работает, необходимо установить правила в случае, если может произойти сбой, например, если вы вызываете более 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_())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...