SQLITE3 — Как автоматически определить таблицу в моей базе данных на основе введенных данных?

#python #sqlite #pyqt5

#python #sqlite #pyqt5

Вопрос:

Я настраиваю функцию для добавления новой строки данных, которые будут введены в мою базу данных в одной из 8 «таблиц материалов».

 def Add_New(self):
    pref = self.adding.addcode_text.text()
    grade = self.adding.addgrade_text.text()
    desc = self.adding.adddesc_text.text()
    supp = self.adding.addsupp_text.text()
    try:
        c.execute('INSERT INTO ***auto detected table*** (prefix,grade,desc1,supplier)VALUES(?,?,?,?)',(pref,grade,desc,supp))
        conn.commit()
        print('DONE')
        self.Load_***Auto detected***Db()
    except Exception as error:
        print(error)
  

Я не уверен, как заставить его автоматически определять, в какую таблицу поместить новую строку данных, на основе ввода пользователем ‘Pref’. Pref — это уникальный трехзначный код. каждой таблице выделен диапазон значений …. т.е. в таблице 1 все трехзначные коды начинаются с ‘1’. в таблице 2 все трехзначные коды начинаются с ‘2’ и т.д.

Нужен ли мне оператор if для обработки этого? если 1-я цифра равна 1, то выберите таблицу 1 в базе данных для ее сохранения? Или я могу указать на правильную таблицу, попросив ее идентифицировать currentwidget и на что это указывает?

Я назначу функцию кнопке для запуска события.

Приношу извинения за вопросы новичков, это моя первая неделя программирования, и мне действительно пригодилась бы любая помощь, которую вы, ребята, можете предложить.

возврат базы данных материалов к tablewidgets:

возврат базы данных материалов к tablewidgets

 import sqlite3
from mcnc import Ui_MainWindow
import mcnclogo_rc
from PyQt5 import QtCore,QtGui
from PyQt5.QtWidgets import QApplication,QMainWindow,QTableWidgetItem
import sys

conn = sqlite3.connect('codes.db')
c = conn.cursor()
c.execute('')

class MainApp(QMainWindow, Ui_MainWindow):
    def __init__(self,parent=None):
        super(MainApp,self).__init__(parent)

        self.setupUi(self)
        self.Load_StainlessDb()
        self.Load_SteelDb()
        self.Load_aluminiumDb()
        self.Load_plasticDb()
        self.Load_miscDb()
        self.Load_duplexDb()
        self.Load_consumablesDb()
        self.Load_freeIssueDb()

    def Load_StainlessDb(self):
        content = 'SELECT * FROM stainless'
        res = conn.execute(content)
        for row_index, row_data in enumerate(res):
            self.tableWidget_9.insertRow(row_index)
            for column_index, column_data in enumerate(row_data):
                self.tableWidget_9.setItem(row_index, column_index,         
                QTableWidgetItem(str(column_data)))
        conn.close
        return

    def Load_SteelDb(self):
        content = 'SELECT * FROM steel'
        res = conn.execute(content)
        for row_index, row_data in enumerate(res):
            self.tableWidget_2.insertRow(row_index)
            for column_index, column_data in enumerate(row_data):
                self.tableWidget_2.setItem(row_index, column_index,     
                QTableWidgetItem(str(column_data)))
        conn.close
        return

    def Load_aluminiumDb(self):
        content = 'SELECT * FROM aluminium'
        res = conn.execute(content)
        for row_index, row_data in enumerate(res):
            self.tableWidget_3.insertRow(row_index)
            for column_index, column_data in enumerate(row_data):
                self.tableWidget_3.setItem(row_index, column_index,     
                QTableWidgetItem(str(column_data)))
        conn.close
        return

    def Load_plasticDb(self):
        content = 'SELECT * FROM plastic'
        res = conn.execute(content)
        for row_index, row_data in enumerate(res):
            self.tableWidget_4.insertRow(row_index)
            for column_index, column_data in enumerate(row_data):
                self.tableWidget_4.setItem(row_index, column_index, 
                QTableWidgetItem(str(column_data)))
        conn.close
        return

    def Load_miscDb(self):
        content = 'SELECT * FROM misc'
        res = conn.execute(content)
        for row_index, row_data in enumerate(res):
            self.tableWidget_5.insertRow(row_index)
            for column_index, column_data in enumerate(row_data):
                self.tableWidget_5.setItem(row_index, column_index, 
                QTableWidgetItem(str(column_data)))
        conn.close
        return

    def Load_duplexDb(self):
        content = 'SELECT * FROM duplex'
        res = conn.execute(content)
        for row_index, row_data in enumerate(res):
            self.tableWidget_6.insertRow(row_index)
            for column_index, column_data in enumerate(row_data):
                self.tableWidget_6.setItem(row_index, column_index,     
                QTableWidgetItem(str(column_data)))
        conn.close
        return

    def Load_consumablesDb(self):
        content = 'SELECT * FROM consumables'
        res = conn.execute(content)
        for row_index, row_data in enumerate(res):
            self.tableWidget_7.insertRow(row_index)
            for column_index, column_data in enumerate(row_data):
                self.tableWidget_7.setItem(row_index, column_index, 
                QTableWidgetItem(str(column_data)))
        conn.close
        return

    def Load_freeIssueDb(self):
        content = 'SELECT * FROM freeIssue'
        res = conn.execute(content)
        for row_index, row_data in enumerate(res):
            self.tableWidget_8.insertRow(row_index)
            for column_index, column_data in enumerate(row_data):
                self.tableWidget_8.setItem(row_index, column_index, 
                QTableWidgetItem(str(column_data)))
        conn.close
        return

    def Add_New(self):
        pref = self.adding.addcode_text.text()
        grade = self.adding.addgrade_text.text()
        desc = self.adding.adddesc_text.text()
        supp = self.adding.addsupp_text.text()
        try:
            c.execute('INSERT INTO t     
            (prefix,grade,desc1,supplier)VALUES(?,?,?,?)', 
            (pref,grade,desc,supp))
            conn.commit()
            print('DONE')
            self.Load_freeIssueDb()
        except Exception as error:
        print(error)

if __name__=="__main__":
    app = QApplication(sys.argv)
    w = MainApp()
    w.show()
    sys.exit(app.exec_())
  

Вот код на месте с необходимыми изменениями в именах таблиц…

 def Add_New(self):
    pref = self.adding.addcode_text.text()
    grade = self.adding.addgrade_text.text()
    desc = self.adding.adddesc_text.text()
    supp = self.adding.addsupp_text.text()
    tables = {"1": "Stainless", "2": "Steel", "3": "Aluminium", "4": 
    "Plastic", "5": "misc", "6": "duplex", "8": "consumables", "9": 
    "freeIssue" }
    table = tables[pref[0]]
try:
    c.execute('INSERT INTO '   table   ' 
    (prefix,grade,desc1,supplier)VALUES(?,?,?,?)',(pref,grade,desc,supp))
    conn.commit()
    print('DONE')
    getattr(self, 'Load_'   table   'Db')()
except Exception as error:
    print(error)
  

Также здесь находится инструкция buttonWidget connect…

 self.ui = MainApp()
    self.ui.pushButton_3.clicked.connect(self.Add_New)
    self.show
  

Вот как это выглядит в Visual Studio для меня…

Код в том виде, в каком он отображается в Visual Studio

Комментарии:

1. Всегда ли только первая цифра определяет, какая таблица?

2. Да, 1-я цифра в таблице не меняется … например, 101-199 — это таблица 1, 201-299 — таблица 2 и т.д. однако диапазон нигде не определен в моем коде или базе данных.

Ответ №1:

Если таблицу определяет только первая цифра, вы можете использовать словарь для сопоставления цифр с именами таблиц.

При вызове Load_XXXDb() метода вы можете использовать getattr() для динамического получения атрибута.

 def Add_New(self):
    pref = self.adding.addcode_text.text()
    grade = self.adding.addgrade_text.text()
    desc = self.adding.adddesc_text.text()
    supp = self.adding.addsupp_text.text()
    tables = {"1": "Stainless", "2": "Steel", "3": "Aluminum", ...}
    table = tables[pref[0]]
    try:
        c.execute('INSERT INTO '   table   ' (prefix,grade,desc1,supplier)VALUES(?,?,?,?)',(pref,grade,desc,supp))
        conn.commit()
        print('DONE')
        getattr(self, 'Load_'   table   'Db')()
    except Exception as error:
        print(error)