Не создаётся таблица в PyQt6
Наконец-то я нашел литературу (с русским переводом) по созданию БД на PyQt6.
PyQt6 для начинающих (Практический подход к графических интерфейсов с PyQt6). Автор Джошуа М. Уиллман.
И столкнулся с ошибкой:
Process finished with exit code -1073741819 (0xC0000005)
И что только я смотрел точки останова, закомментировал оператор выбора If... Then... , на папку где находится файл проекты открыл дал права Администратора (Вообщем танцы с бубном не танцевал).
Ниже я выкладываю листинг и файл с проектом cделанный на моем любимом PyCharm
# Импорт необходимых модулей
import sys, random
import sqlite3
from PyQt6.QtSql import QSqlDatabase, QSqlQuery
class CreateEmployeeData:
"""Создаём пример базы данных для проекта
Класс демонстрирует как подключаться к базе данных, создавать
запросы, создавать таблицы и записи в этих таблицах"""
# Создаём соединение с базой данных. Если файл db
# не существует, будет создан новый файл db
# Использовать драйвер SQLite версии 3
#faulthandler.enable()
database = QSqlDatabase.addDatabase("QSQLITE")
database.setDatabaseName("accounts.db")
if not database.open():
print("Невозможно открыть файл источника данных")
sys.exit(1) # Код ошибки 1 - означает ошибку
# create database
query = QSqlQuery()
# Стирание содержимого базы данных
query.exec("DROP TABLE accounts")
query.exec("DROP TABLE countries")
query.exec("""CREATE TABLE accounts (
id INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE NULL,
employee_id INTEGER NOT NULL,
first_name VARCHAR(30) NOT NULL,
last_name VARCHAR(30) NOT NULL,
email VARCHAR(40) NOT NULL,
department VARCHAR(20) NOT NULL,
country_id VARCHAR(20) REFERENCES countries(id))""")
# Позиционная привязка для вставки записей в базу данных
query.prepare("""INSERT INTO accounts(
amployee_id, first_name, last_name,
email, department, country_id)
VALUES (?, ?, ?, ?, ?, ?)""")
first_name = ["Emma", "Olivia", "Ava", "Isabella",
"Mia", "Charlotte", "Amelia", "Abigail",
"Valorie", "Teesha", "Jazzmin", "Liam",
"Noah", "William", "James", "Logan",
"Benjamin", "Mason", "Elajah", "Oliver",
"Lucas", "Michael"]
last_name = ["Smith", "Johnson", "Williams", "Brown",
"Jones", "Miller", "Davis", "Rodriguez",
"Martinez", "Hernandez", "Lopez", "Gonzalez",
"Wilson", "Anderson", "Thomas", "Taylor",
"Moore", "Jackson", "Martin", "Lee",
"Perez", "Thompson", "White", "Harris"]
# Создайте данные для первой таблицы
employee_ids = random.sample(
range(1000, 2500), len(first_name))
countries = {"USA":1, "India":2, "China":3,
"France":4, "United Kingdom":5, "Germany":6}
country_names = list(countries.keys())
country_codes = list(countries.values())
departments = ["Production", "R&D", "Marketing", "HR",
"Finance", "Engineering", "Managerial"]
for f_name in first_name:
l_name = last_name.pop()
email = (l_name + f_name[0].lower() + "@job.com")
country_id = random.choice(country_codes)
dept = random.choice(departments)
employee_id = employee_ids.pop()
query.addBindValue(employee_id)
query.addBindValue(f_name)
query.addBindValue(l_name)
query.addBindValue(email)
query.addBindValue(dept)
query.addBindValue(country_id)
query.exec()
# создайте данные для второй таблицы
country_query = QSqlQuery()
country_query.exec("""CREATE TABLE countries (
id INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE NULL,
country VARCHAR(20) NOT NULL)""")
country_query.prepare(
"""INSERT INTO countries(country) VALUES (?)""")
for name in country_names:
country_query.addBindValue(name)
country_query.exec()
print("[NFO] Database succesfully created")
if __name__ == '__main__':
CreateEmployeeData()
sys.exit(0)
Ответы (1 шт):
Чтобы получить реальную ошибку, всегда запустите ваше приложение
в консоли/терминале/CMD.
Хотя у меня, при запуске вашего кода в CMD,
никаких ошибок не было, но таблица accounts была пустая.
Я уже начал переписывать код и случайно заметил вашу опечатку.
query.prepare("""INSERT INTO accounts(amployee_id, ... # ---
# ----------------------------------> v <------------------- # !!!
query.prepare("""INSERT INTO accounts(employee_id, ... # +++
# ----------------------------------> ^ <------------------- # !!!
Я также немного поправил ваш код и визуализировал его.
Поменяйте импорты для PyQt6 и попробуйте.
Литература (с русским переводом) это хорошо, но помните, что самое полное руководство по SQL Programming, которое содержит информацию о разработке с использованием Qt SQL, находится в документации.
import sys
import random
#? import sqlite3
''' установите импорты для PyQt6
from PyQt6.QtSql import QSqlDatabase, QSqlQuery, \
QSqlRelationalTableModel, QSqlRelation
from PyQt6.QtWidgets import QMainWindow, QWidget, \
QVBoxLayout, QTableView, QApplication
from PyQt6.QtCore import Qt
'''
from PyQt5.QtSql import QSqlDatabase, QSqlQuery, \
QSqlRelationalTableModel, QSqlRelation
from PyQt5.QtWidgets import QMainWindow, QWidget, \
QVBoxLayout, QTableView, QApplication
from PyQt5.QtCore import Qt
class Example(QMainWindow):
def __init__(self):
super().__init__()
self.createConnection()
self.create_employee_data()
self.createModel()
self.initUI()
self.centralWidget = QWidget()
self.setCentralWidget(self.centralWidget)
layout = QVBoxLayout(self.centralWidget)
layout.addWidget(self.view)
def createConnection(self):
self.db = QSqlDatabase.addDatabase("QSQLITE")
self.db.setDatabaseName("accounts.db")
if not self.db.open():
print("Невозможно открыть файл источника данных")
return False
#? class CreateEmployeeData:
# +
def create_employee_data(self): # +++
""" Создаём пример базы данных для проекта """
self.db.transaction()
query = QSqlQuery()
# Стирание содержимого базы данных
query.exec("DROP TABLE accounts")
query.exec("DROP TABLE countries")
# создайте данные для таблицы countries
country_query = QSqlQuery()
country_query.exec("""CREATE TABLE countries (
id INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE NULL,
country VARCHAR(20) NOT NULL)""")
_countries = {
"USA": 1,
"India": 2,
"China": 3,
"France": 4,
"United Kingdom": 5,
"Germany": 6
}
_country_names = list(_countries.keys())
country_query.prepare(
"""INSERT INTO countries (country) VALUES (?)""")
for name in _country_names:
country_query.addBindValue(name)
country_query.exec()
query.exec("""CREATE TABLE accounts (
id INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE NULL,
employee_id INTEGER NOT NULL,
first_name VARCHAR(30) NOT NULL,
last_name VARCHAR(30) NOT NULL,
email VARCHAR(40) NOT NULL,
department VARCHAR(20) NOT NULL,
country_id VARCHAR(20) REFERENCES countries(id))""")
# Позиционная привязка для вставки записей в базу данных
# !!! amployee_id, first_name, last_name,
query.prepare("""INSERT INTO accounts(
employee_id, first_name, last_name,
email, department, country_id)
VALUES (?, ?, ?, ?, ?, ?)""")
first_name = [
"Emma", "Olivia", "Ava", "Isabella",
"Mia", "Charlotte", "Amelia", "Abigail",
"Valorie", "Teesha", "Jazzmin", "Liam",
"Noah", "William", "James", "Logan",
"Benjamin", "Mason", "Elajah", "Oliver",
"Lucas", "Michael"
]
last_name = [
"Smith", "Johnson", "Williams", "Brown",
"Jones", "Miller", "Davis", "Rodriguez",
"Martinez", "Hernandez", "Lopez", "Gonzalez",
"Wilson", "Anderson", "Thomas", "Taylor",
"Moore", "Jackson", "Martin", "Lee",
"Perez", "Thompson", "White", "Harris"
]
# Создайте данные для таблицы accounts
employee_ids = random.sample(
range(1000, 2500), len(first_name))
country_codes = list(_countries.values())
departments = [
"Production", "R&D", "Marketing", "HR",
"Finance", "Engineering", "Managerial"
]
for f_name in first_name:
l_name = last_name.pop()
email = (l_name + f_name[0].lower() + "@job.com")
country_id = random.choice(country_codes)
dept = random.choice(departments)
employee_id = employee_ids.pop()
query.addBindValue(employee_id)
query.addBindValue(f_name)
query.addBindValue(l_name)
query.addBindValue(email)
query.addBindValue(dept)
query.addBindValue(country_id)
query.exec()
self.db.commit()
print("[NFO] Database succesfully created")
def createModel(self):
self.model = QSqlRelationalTableModel()
self.model.setTable("accounts")
self.model.setHeaderData(0, Qt.Horizontal, "ID записи")
self.model.setHeaderData(1, Qt.Horizontal, "ID сотрудника")
self.model.setHeaderData(2, Qt.Horizontal, "Имя")
self.model.setHeaderData(3, Qt.Horizontal, "Фамилия")
self.model.setHeaderData(4, Qt.Horizontal, "Email")
self.model.setHeaderData(5, Qt.Horizontal, "Отдел")
self.model.setHeaderData(6, Qt.Horizontal, "Страна")
self.set_relation()
self.model.select()
def set_relation(self):
self.model.setRelation(6, QSqlRelation(
"countries",
"id",
"country"
))
def initUI(self):
self.view = QTableView()
self.view.setModel(self.model)
if __name__ == '__main__':
app = QApplication(sys.argv)
w = Example()
w.setWindowTitle("SqlTableModel Test")
w.resize(900, 500)
w.show()
sys.exit(app.exec_())
