Запись записей в базу данных SQLite с Python PyQt5, которые ранее были прочитаны из базы данных MySQL - PullRequest
0 голосов
/ 17 февраля 2020

Я работаю над программой Python, чтобы запрашивать последние записи из постоянно обновляемой базы данных MySQL и сохранять их в локальной базе данных SQlite. Для обработки доступа к базе данных я создал следующий класс. Пока все работает, только запись в базу данных SQLite очень медленная.

Я знаю, что решение для записи данных не сделано элегантно, но оно работает. Я уже искал решения на inte rnet и уже пытался реализовать некоторые из них. К сожалению, пока безуспешно.

Есть ли способ сделать запись данных быстрее и элегантнее? Можно ли написать полный список или QTableView в базу данных.

#!/usr/bin/python3

import os
import sys
from PyQt5.QtCore import Qt
from PyQt5.QtCore import QDateTime
from PyQt5.QtSql import *
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *

class Database:
    def __init__(self, driver: str, connectionName: str) -> None:
        self.connection = connectionName
        self.db = QSqlDatabase.addDatabase(driver, self.connection)

    def setup_MySQL(self, host: str, database: str, user: str, password: str) -> None:
        self.db.setHostName(host)
        self.db.setDatabaseName(database)
        self.db.setUserName(user)
        self.db.setPassword(password)
        if not self.db.open():
            print(self.db.lastError().text())

    def setup_SQlite(self, database: str) -> None:
        self.db.setDatabaseName(database)
        if not self.db.open():
            print(self.db.lastError().text())

    def fetch_latest_record(self, table_name: str) -> str:
        self.model = QSqlTableModel(None, QSqlDatabase.database(self.connection))
        self.model.setTable(table_name)
        self.model.setSort(0,Qt.DescendingOrder)
        self.model.select()
        return str(self.model.record(0).value("date"))

    def fetch_latest_data(self, TableName: str, Filter: str):
        self.model = QSqlTableModel(None, QSqlDatabase.database(self.connection))
        self.model.setTable(TableName)
        self.model.setFilter(Filter)
        self.model.select()

        self.view = QTableView()
        self.view.setModel(self.model)
        return self.view

    def new_data_available(self, TableName: str, value: QDateTime) -> bool:
        self.model = QSqlTableModel(None, QSqlDatabase.database(self.connection))
        self.model.setTable(TableName)
        self.model.setSort(0, Qt.DescendingOrder)
        self.model.select()
        self.latest = self.model.record(0).value("time")
        if (self.latest > value):
            return True
        return False

    def fetch_table(self, query: str, clause: str = None):
        # check if {date} is available in query and clause is set
        if ('{date}' in query) and clause:
            self.query = query.format(date=clause)
        else:
            self.query = query
        self.model = QSqlQueryModel() #None, QSqlDatabase.database(self.connection))
        #self.model.setQuery(QSqlQuery(self.query), QSqlDatabase.database(self.connection))
        self.model.setQuery(self.query, QSqlDatabase.database(self.connection))
        self.view = QTableView()
        self.view.setModel(self.model)

        #print("current connections: ", self.db.connectionNames())

        return self.view

    def write_db(self, tableName: str, data) -> None:

        # Prepare query
        raw_query = "INSERT OR IGNORE INTO {table} (date, value) VALUES(:date, :value)"
        raw_query = raw_query.format(table=tableName)

        # print("Raw-Query: ", raw_query)
        query = QSqlQuery(QSqlDatabase.database(self.connection)) #None, QSqlDatabase.database(self.connection))
        query.prepare(raw_query)
        for row in range(len(data[0])):
            query.bindValue(":date", data[0][row])
            query.bindValue(":value", data[1][row])
            query.exec_()

    # Close database in destructor
    def __del__(self):
        print("Destructor called")
        self.db.close()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    # Open MySQL database and read data
    mysql_db = Database("QMYSQL", "MySQL_connection")
    mysql_db.setup_MySQL("192.168.1.100", "mydata", "Readdb", "passwort")
    view1 = mysql_db.fetch_table("SELECT time, value FROM Item44 WHERE time > '{date}'", "2020-01-15 00:00:00")
    view2 = mysql_db.fetch_latest_data("Item44", "time >= '2020-01-15 00:00:00'")


    # Determine the size of the data (QTableView)
    row_count = view1.verticalHeader().count()
    column_count = view1.horizontalHeader().count()

    # Define a multidimensional list with x columns
    data_list = [[] for colum in range(column_count)]

    # Transver data into multidimensional data_list 
    for row in range(row_count):
        for column in range(column_count):
            data_list[column].append(table.model().data(table.model().index(row, column)))

    # Write data fom view1 into SQlite database
    sqlite_db = Database("QSQLITE", "sqlite_connection")
    sqlite_db.setup_SQlite("myDatabase.db")
    sqlite_db.write_db("test", view1)

    # Setup Dialog to show information from Databases
    dlg = QDialog()
    layout = QHBoxLayout()
    layout.addWidget(view1)
    layout.addWidget(view2)

    dlg.setLayout(layout)
    dlg.setWindowTitle("Database Demo")
    dlg.show()

    date = QDateTime.currentDateTime()
    print("Output von date:   " + str(date))
    date = date.addDays(-5)
    print("Output von date:   " + str(date))
    print()

    sys.exit(app.exec_())
...