PySide2 и MySQL не могу подключиться для отображения таблицы из базы данных
Не получается отобразить таблицу из удаленной базы данных QTableView с помощью QSqlTableModel (я так понял что не проходит само подключение к базе). Есть вот такой код, который не работает, не могу понять в чем проблема...
import sys
from PySide2.QtCore import QSize
from PySide2.QtSql import QSqlDatabase, QSqlTableModel
from PySide2.QtWidgets import QApplication, QMainWindow, QTableView
db = QSqlDatabase.addDatabase("QMYSQL")
db.setHostName("server167.hosting.reg.ru")
db.setDatabaseName("db")
db.setUserName("<user name>")
db.setPassword("<password>")
db.open()
print(db, type(db))
if db.open():
print("Database Open!")
else:
print("Database NOT Open!")
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.table = QTableView()
self.model = QSqlTableModel(db=db)
self.table.setModel(self.model)
self.model.setTable("objects")
self.model.select()
self.setMinimumSize(QSize(1024, 600))
self.setCentralWidget(self.table)
app = QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec_()
Данные подключения 100 раз проверил, так как код по заполнению таблицы 100 % выполняется, я бы мог конечно коннектор все забирать, но очень хочется средствами Qt =) Код заполнения таблицы базы данных:
import mysql.connector as mysql
mysql_conn = mysql.connect(
host='server167.hosting.reg.ru',
user='u1082920_root',
password='1501kZn1501!',
database = 'u1082920_docs_db'
)
with mysql_conn as connection:
cursor = connection.cursor()
cursor.execute("""DROP TABLE IF EXISTS objects""")
cursor.execute("""CREATE TABLE objects(id INTEGER PRIMARY KEY, data TEXT NOT NULL,
plan TEXT NOT NULL, name_plan TEXT NOT NULL)""")
# # SQL запрос на вставку
query = f"INSERT INTO objects (id, data,plan,name_plan) VALUES ('{1}', '{str(2)}', '{str(3)}', '{str(4)}')"
cursor.execute(query)
query = f"INSERT INTO objects (id, data,plan,name_plan) VALUES ('{2}', '{str(2)}', '{str(3)}', '{str(4)}')"
cursor.execute(query)
connection.commit()
connection.close()
Ответы (2 шт):
А зачем два раза db.open()?
Проверьте подключение к БД
from PySide2.QtSql import QSqlError
if db.open():
print("Database Open!")
else:
print(f"Database NOT Open cause {db.lastError().text()}")
очень сильно подозреваю что будет ошибка QSqlDatabase: QMYSQL driver not loaded. см https://stackoverflow.com/questions/64056483/unable-to-load-qmysql-driver-on-pyside2
Штука была именно в отсутствии драйвера QMYSQL (спасибо Sergey Tatarincev). Наиболее приемлемым для себя нашел выход в установке уже готовых драйверов (знаний для их самостоятельной сборки, пусть и по инструкции у меня не хватает).
спасибо добрый человек выкладывает готовые драйвера (например QMYSQL driver 5.15.2)
С простой инструкцией по установке (приведу ее тут, так как она на мой взгляд не очень очевидно в репозитории лежит):
Развертывание
- поместите qsqlmysql.dll (если сборка выпуска) / qsqlmysqld.dll (если сборка отладки, но обратите внимание, что при использовании MinGW 8.1.0 или более поздней версии сборка отладки также называется qsqlmysql.dll) в подкаталог приложения «sqldrivers»
- поместите libmysql.dll (сама библиотека MySQL) и библиотеки OpenSSL v1.1, libcrypto-1_1 и libssl-1_1, в каталог вашего приложения
В принципе после этих всё заработало =)