Skip to content

Python App to interact with PostgreSQL Database

Notifications You must be signed in to change notification settings

pshptr/DataBase

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

16 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Python App to interact with PostgreSQL Database

Демонстрация работы программы

Демонстрация работы программы

Общее описание программы

Для работы с базой данных было разработано приложение на языке Python. В качестве инструментов использовались библиотеки «psycopg2» для подключения к базе данных PostgreSQL и tkinter для создания графического интерфейса пользователя. Взаимодействие с базой данных осуществлялось с помощью языка SQL.

Описание работы программы

Приложение предоставляет пользователю возможность взаимодействия с базой данных PostgreSQL. После запуска приложения пользователь видит главное окно, где доступно поле для ввода SQL- запроса и кнопка для его выполнения. Результат выполнения запроса отображается в текстовом поле ниже.

Схема работы программы

Схема работы приложения

Диаграмма классов программы

Диаграмма классов программы

Листинг программы

import tkinter as tk
from tkinter import messagebox
import psycopg2

def validate_input(input_string):
    """Validate input string."""
    valid_chars = set('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-.')
    return all(char in valid_chars for char in input_string)

def connect_to_database(host, database, user, password, port="5434"):
    """Функция для подключения к базе данных PostgreSQL."""
    if not all(validate_input(part) for part in (host, database, user, password)):
        messagebox.showerror("Error", "Wrong symbols.")
        return None

    try:
        connection = psycopg2.connect(
            host="localhost",
            database="STO",
            user="postgres",
            password="password",
            port="5434"
        )
        print("Connection to database is successfull!")
        return connection
    except (Exception, psycopg2.Error) as error:
        print(f"Error connection to database: {error}")
        return None

def execute_query(connection, query):
    """Функция для выполнения SQL-запроса к базе данных."""
    try:
        cursor = connection.cursor()
        cursor.execute(query)
        connection.commit()
        print("Query successfully executed!")
        return cursor.fetchall()  # Возвращаем результат запроса
    except (Exception, psycopg2.Error) as error:
        print(f"Error executing query: {error}")
        connection.rollback()  # Откатываем транзакцию в случае ошибки
        return None
    finally:
        cursor.close()  # Закрываем курсор после выполнения запроса


def show_table_names(connection):
    cursor = connection.cursor()
    cursor.execute("SELECT table_name FROM information_schema.tables WHERE table_schema = 'public'")
    table_names = cursor.fetchall()
    cursor.close()

    result_text.delete(1.0, tk.END)
    for table_name in table_names:
        result_text.insert(tk.END, f"{table_name}\n")

# Создание основного окна
root = tk.Tk()
root.title("Database App")

# Создание виджетов
query_label = tk.Label(root, text="Enter SQL-query:")
query_entry = tk.Entry(root, width=50)
submit_button = tk.Button(root, text="Execute query", command=lambda: submit_query(connection, query_entry.get()))
result_label = tk.Label(root, text="Result:")
result_text = tk.Text(root, width=75, height=30)

# Размещение виджетов на окне
query_label.grid(row=0, column=0, padx=10, pady=5)
query_entry.grid(row=0, column=1, padx=10, pady=5)
submit_button.grid(row=1, column=0, columnspan=2, padx=10, pady=5)
result_label.grid(row=2, column=0, padx=10, pady=5)
result_text.grid(row=3, column=0, columnspan=2, padx=10, pady=5)

# Подключение к базе данных
connection = connect_to_database("localhost", "STO", "postgres", "password")

# Создание кнопок для таблиц
table_buttons_frame = tk.Frame(root)
table_buttons_frame.grid(row=4, column=0, columnspan=2, padx=10, pady=5)

for table_name in ['car', 'client', 'orders', 'service', 'mechanic', 'service_stations', 'order_service']:
    button = tk.Button(table_buttons_frame, text=table_name, command=lambda t=table_name: show_table_data(connection, f"SELECT * FROM {t}"))
    button.pack(side=tk.LEFT, padx=5, pady=5)

# Функции для кнопок
def show_table_data(connection, query):
    result = execute_query(connection, query)
    if result is not None:
        result_text.delete(1.0, tk.END)
        # Выводим имена полей таблицы
        cursor = connection.cursor()
        cursor.execute(query)
        field_names = [field[0] for field in cursor.description]
        result_text.insert(tk.END, '\t'.join(field_names))
        result_text.insert(tk.END, '\n')
        cursor.close()
        # Выводим данные
        for row in result:
            result_text.insert(tk.END, '\t'.join(map(str, row)))
            result_text.insert(tk.END, '\n')
    else:
        messagebox.showerror("Error", "Error executing query")

def submit_query(connection, query):
    result = execute_query(connection, query)
    if result is not None:
        result_text.delete(1.0, tk.END)
        # Выводим имена полей таблицы
        cursor = connection.cursor()
        cursor.execute(query)
        field_names = [field[0] for field in cursor.description]
        result_text.insert(tk.END, '\t'.join(field_names))
        result_text.insert(tk.END, '\n')
        cursor.close()
        # Выводим данные
        for row in result:
            result_text.insert(tk.END, '\t'.join(map(str, row)))
            result_text.insert(tk.END, '\n')
    else:
        messagebox.showerror("Error", "Error executing query")


# Запуск основного цикла приложен��я
root.mainloop()

About

Python App to interact with PostgreSQL Database

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published