Не создаётся таблица в PyQt6

Рейтинг: 0Ответов: 1Опубликовано: 03.03.2025

Наконец-то я нашел литературу (с русским переводом) по созданию БД на 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_())    

введите сюда описание изображения