Загрузка данных


"""
Импортёр БД АВТОСЕРВИС в MySQL (Open Server) — весь SQL внутри скрипта.
Запуск: python import_db.py
"""
import sys
import pymysql

# Подключение БЕЗ выбора базы — её создаёт сам скрипт
DB_CONFIG = {
    "host": "localhost",
    "port": 3306,
    "user": "root",
    "password": "",      # в Open Server у root пароль обычно пустой
    "charset": "utf8mb4",
}

DDL = [
    "CREATE DATABASE IF NOT EXISTS autoservice "
    "CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci",
    "USE autoservice",

    "DROP TABLE IF EXISTS Orders",
    "DROP TABLE IF EXISTS MechanicWork",
    "DROP TABLE IF EXISTS Contracts",
    "DROP TABLE IF EXISTS Clients",
    "DROP TABLE IF EXISTS Works",
    "DROP TABLE IF EXISTS Mechanics",

    """CREATE TABLE Mechanics (
        passport     VARCHAR(20) PRIMARY KEY,
        last_name    VARCHAR(50) NOT NULL,
        first_name   VARCHAR(50) NOT NULL,
        middle_name  VARCHAR(50),
        address      VARCHAR(150),
        phone        VARCHAR(20)
    ) ENGINE=InnoDB""",

    """CREATE TABLE Contracts (
        contract_no  INT PRIMARY KEY,
        passport     VARCHAR(20) NOT NULL UNIQUE,
        sign_date    DATE NOT NULL,
        term_years   INT NOT NULL,
        terminated   TINYINT NOT NULL DEFAULT 0,
        term_date    DATE,
        FOREIGN KEY (passport) REFERENCES Mechanics(passport)
    ) ENGINE=InnoDB""",

    """CREATE TABLE Works (
        work_code    INT PRIMARY KEY,
        name         VARCHAR(100) NOT NULL,
        norm_hours   DECIMAL(6,2),
        cost         DECIMAL(10,2),
        price        DECIMAL(10,2),
        wage_fund    DECIMAL(10,2)
    ) ENGINE=InnoDB""",

    """CREATE TABLE MechanicWork (
        passport   VARCHAR(20) NOT NULL,
        work_code  INT NOT NULL,
        PRIMARY KEY (passport, work_code),
        FOREIGN KEY (passport)  REFERENCES Mechanics(passport),
        FOREIGN KEY (work_code) REFERENCES Works(work_code)
    ) ENGINE=InnoDB""",

    """CREATE TABLE Clients (
        client_id  INT AUTO_INCREMENT PRIMARY KEY,
        name       VARCHAR(150) NOT NULL,
        address    VARCHAR(150),
        phone      VARCHAR(20),
        car        VARCHAR(50),
        login      VARCHAR(50) UNIQUE,
        password   VARCHAR(50)
    ) ENGINE=InnoDB""",

    """CREATE TABLE Orders (
        order_no    INT PRIMARY KEY,
        client_id   INT NOT NULL,
        work_code   INT NOT NULL,
        order_date  DATE NOT NULL,
        done_date   DATE,
        qty         INT NOT NULL DEFAULT 1,
        FOREIGN KEY (client_id) REFERENCES Clients(client_id),
        FOREIGN KEY (work_code) REFERENCES Works(work_code)
    ) ENGINE=InnoDB""",
]

# Данные: (запрос, список кортежей)
DATA = [
    ("INSERT INTO Mechanics VALUES (%s,%s,%s,%s,%s,%s)", [
        ('4500111222', 'Иванов', 'Иван', 'Иванович', 'ул. Ленина, 1', '79001112233'),
        ('4500333444', 'Петров', 'Пётр', 'Петрович', 'ул. Мира, 5', '79004445566'),
    ]),
    ("INSERT INTO Contracts (contract_no,passport,sign_date,term_years,terminated,term_date) "
     "VALUES (%s,%s,%s,%s,%s,%s)", [
        (1, '4500111222', '2024-01-10', 2, 0, None),
        (2, '4500333444', '2024-03-01', 1, 0, None),
    ]),
    ("INSERT INTO Works VALUES (%s,%s,%s,%s,%s,%s)", [
        (101, 'Замена масла', 1.0, 300, 1000, 400),
        (102, 'Ремонт тормозов', 3.0, 1500, 4000, 1600),
        (103, 'Диагностика двигателя', 2.0, 800, 2500, 1000),
    ]),
    ("INSERT INTO MechanicWork VALUES (%s,%s)", [
        ('4500111222', 101), ('4500111222', 102),
        ('4500333444', 102), ('4500333444', 103),
    ]),
    ("INSERT INTO Clients (client_id,name,address,phone,car,login,password) "
     "VALUES (%s,%s,%s,%s,%s,%s,%s)", [
        (1, 'Сидоров Алексей', 'ул. Садовая, 7', '79007778899', 'Lada Vesta А123ВС', 'sidorov', '1234'),
        (2, 'ООО Логистика', 'пр. Победы, 20', '78005550000', 'ГАЗель Х777ОР', 'logistika', '5678'),
    ]),
    ("INSERT INTO Orders VALUES (%s,%s,%s,%s,%s,%s)", [
        (1, 1, 101, '2024-05-01', '2024-05-01', 1),
        (2, 1, 102, '2024-05-10', None, 1),
        (3, 2, 103, '2024-05-12', '2024-05-13', 2),
        (4, 2, 101, '2024-05-15', '2024-05-15', 3),
    ]),
]


def main():
    try:
        con = pymysql.connect(**DB_CONFIG)
    except pymysql.MySQLError as e:
        sys.exit(f"Нет подключения к MySQL. Запущен ли Open Server?\n{e}")

    try:
        with con.cursor() as cur:
            for stmt in DDL:
                cur.execute(stmt)
            for query, rows in DATA:
                cur.executemany(query, rows)
        con.commit()
        print("Готово. База autoservice создана и заполнена.")
    except pymysql.MySQLError as e:
        con.rollback()
        sys.exit(f"Ошибка при выполнении SQL:\n{e}")
    finally:
        con.close()


if __name__ == "__main__":
    main()