Добавил:
Developer Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курсовой проект.docx
Скачиваний:
2
Добавлен:
28.12.2023
Размер:
213 Кб
Скачать
☆

Restrictions and defaults

OS: Windows 10

Режим работы: интерактивный

циклический

Поток вывода: консоль

Programming language: python

Preprocessor: py

Compiler: CPython

Файл лога: log.txt – пользователь не вводит адрес для файла лога, он находится по умолчанию (либо создается сам) там же, где программа

Схема

Реализация взаимодействия с бд

Подключение к базе данных осуществляется сервером приложений путем вызова функции:

mysql_real_connect(connection,mysql_details.server, mysql_details.user, mysql_details.password, mysql_details.database, 0, nullptr, 0))

Параметры:

server = "localhost"; - где находится база данных MySQL

user = "UNIVERSITY"; - администратор БД

password = "nekxBOnlmlQlX"; - пароль от базы данных

database = "RECORD_CARD"; - выбираемая база данных

connection = mysql_init(NULL); - создание экземпляра MySQL и инициализация переменных

Функции

def main ();

Функция main является главной функцией программы.

Выходные параметры отсутствуют.

def start() - инициализация времени старта, лога.

def finish(int ExitCode) - задание времени закрытия программы, закрытие файла лога.

def diag(int ExitCode) - диагностика ошибок, обработка кодов возврата.

def mysql_connection_setup(struct connection_details mysql_details) - настройка SQL соединения.

def mysql_add(MYSQL connection) - добавление данных в базу данных.

def mysql_select(MYSQL connection) – выбор данных из базы данных.

def SQL_Close() – закрытие соединения с базой данных.

def menu(MYSQL connection) - вывод меню.

Контрольный пример

Запускаем .py. Выбираем из контекстного меню вариант «Добавить студента».

Проверяем добавление студента в базу данных:

Выходим из программы:

Программный код

Листинг 1 – Исходный код проекта University_record_card.py

from getpass import getpass

from mysql.connector import connect, Error

import datetime

#Функция main является главной функцией программы.

def main():

start()

print("Enter start procedure/n")

#Подключение к СУБД

connection = mysql_connection_setup()

#Открытие функции меню

menu(connection)

#Инициализация времени старта, лога.

def start():

now = datetime.datetime.now()

#Вывод времени старта программы

print (now.strftime("%d-%m-%Y %H:%M"))

logfile = open("C:\Program Files(x86)\MySQL\var\log\mysql\mysql.log")

#Настройка SQL соединения

def mysql_connection_setup(struct connection_details mysql_details):

print("Enter mysql_connection_setup procedure.")

try:

with connect(

host="localhost",

user="UNIVERSITY",

password="nekxBOnlmlQlX",

database ="RECORD_CARD"

) as connection:

except Error as ExitCode:

diag(ExitCode)

print("Exit mysql_connection_setup procedure.")

return connection

#Вывод меню

def menu(MYSQL connection):

print("Menu/n")

print("Chose the option/n")

print("1) Add student name/n")

print("2) Get information/n")

print("3) Exit"/n)

user_input = input()

print("/n")

print(">Exit menu procedure./n")

#Обработка выбора пользователя

switch(user_input)

{

case 1: mysql_add(connection)

break;

case 2: mysql_select(connection)

break;

case 3: SQL_Close()

break;

}

#Добавление данных в базу данных

#Добавление данных студента пользователем

def mysql_add(MYSQL connection)

print("> Enter mysql_add procedure\n")

print("Student_name:")

_name = input()

print("Birthday:")

_birthday = input()

print("Student_bilet:")

_student_bilet = input()

transaction = mydb.cursor()

value.append(_name)

value.append(_birthday)

value.append(_student_bilet)

tuple(value)

try:

sql = "INSERT INTO STUDENTS (name, birthday,student_bilet) VALUES (%s, %s, %s)"

transaction.execute(sql, value)

mydb.commit()

print("Row added")

menu(connection)

except Error as ExitCode:

diag(ExitCode)

#Выбор данных из базы данных

#Вывод данных из таблицы СТУДЕНТ

def mysql_select(MYSQL connection)

try:

print("Student_name:")

name = input()

print("Birthday:")

birthday = input()

print("Student_bilet:")

student_bilet = input()

transaction = mydb.cursor()

transaction.execute("SELECT * FROM STUDENTS WHERE name = %s AND birthday = %s AND student_bilet = %s")

myresult = transaction.fetchone()

for x in myresult:

print(x)

menu(connection)

except Error as ExitCode:

diag(ExitCode)

#Закрытие соединения с базой данных

def SQL_Close():

mydb.close()

finish(ExitCode)

#Диагностика ошибок, обработка кодов возврата

def diag(int ExitCode)

#Обработка кодов возрата

switch(ExitCode)

{

#логируем и выбрасываем исключение типа Error, чтобы сообщить пользователю об ошибки подключения

case 1012: raise ExceptionError("He удается прочитать запись в системной таблице", Error);

transaction.Abort()

break;

#логируем и выбрасываем исключение типа Error, чтобы сообщить пользователю об ошибки подключения

case 1016: raise ExceptionError("He удается открыть файл", Error)

break;

#логируем и выбрасываем исключение типа Error, чтобы сообщить пользователю об ошибки подключения

case 1017: raise ExceptionError("He удается найти файл", Error)

break;

#логируем и выбрасиываем исключение типа Error, чтобы сообщить пользователю об ошибки подключения

case 1020: raise ExceptionError("Запись изменилась с момента последнего считывания таблицы", Error)

transaction.Abort()

break;

#логируем и выбрасываем исключение типа Error, чтобы сообщить пользователю об ошибки подключения

case 1023: raise ExceptionError("Ошибка при закрытии", Error)

break;

#логируем и выбрасываем исключение типа Error, чтобы сообщить пользователю об ошибки подключения

case 1024: raise ExceptionError("Ошибка при чтении файла", Error)

transaction.Abort()

break;

#логируем и выбрасываем исключение типа Error, чтобы сообщить пользователю об ошибки подключения

case 1032: raise ExceptionError("He удается найти запись", Error)

transaction.Abort()

break;

#логируем и выбрасываем исключение типа Error, чтобы сообщить пользователю об ошибки подключения

case 1037: raise ExceptionError("Недостаточно памяти; перезапустите сервер и повторите попытку (нужно сообщить админстратору)", Error)

transaction.Abort()

break;

#логируем и выбрасываем исключение типа Error, чтобы сообщить пользователю об ошибки подключения

case 1047: raise ExceptionError("Неизвестная ошибка (нужно сообщить админстратору)", Error)

transaction.Abort()

break;

#логируем и выбрасиываем исключение типа Error, чтобы сообщить пользователю об ошибки подключения

case 2003: raise ExceptionError("Не удается подключиться к серверу MySQL", Error)

break;

case 2050: raise ExceptionError("Нарушение ограничения целостности ", Error)

transaction.Abort()

break;

default:transaction.Abort()

break;

}

finish(ExitCode)

#Задание времени закрытия программы, закрытие файла лога

def finish(int ExitCode):

#Вывод времени закрытие программы

print (now.strftime("%d-%m-%Y %H:%M"))

print(f"End ended with code:", ExitCode)

print("End finish procedure")

#Закрытие лог файла

logfile.close()

stop(b'\r', 'Нажмите Enter для выхода')

main()