Я работаю над программой 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_())