rebase 0.4 and create 0.5

This commit is contained in:
ada-dmitry
2024-05-05 14:29:47 +03:00
parent 193ad02635
commit 64639d22f6
64 changed files with 615 additions and 0 deletions
Binary file not shown.
+6
View File
@@ -0,0 +1,6 @@
# Базовые параметры настройки конфигурации проекта
dbname: postgres # В классе менять не надо
user: postgres # Замените на свой логин от БД в классе
password: qwerty # Замените на свой пароль от БД в классе
host: localhost # Замените на 192.168.0.48 в классе
dbtableprefix: "public." # Замените на свой логин от БД
+34
View File
@@ -0,0 +1,34 @@
# Установка соединения с базой данных
# (параметры передаются через класс конфиг).
import psycopg2
class DbConnection:
def __init__(self, config):
self.dbname = config.dbname
self.user = config.user
self.password = config.password
self.host = config.host
self.prefix = config.dbtableprefix
self.conn = psycopg2.connect(dbname = self.dbname,
user = self.user,
password = self.password,
host = self.host)
def __del__(self):
if self.conn:
self.conn.close()
def test(self):
cur = self.conn.cursor()
cur.execute("DROP TABLE IF EXISTS test CASCADE")
cur.execute("CREATE TABLE test(test integer)")
cur.execute("INSERT INTO test(test) VALUES(1)")
self.conn.commit()
cur.execute("SELECT * FROM test")
result = cur.fetchall()
cur.execute("DROP TABLE test")
self.conn.commit()
return (result[0][0] == 1)
+86
View File
@@ -0,0 +1,86 @@
# Базовые действия с таблицами
from dbconnection import *
class DbTable:
dbconn = None
def __init__(self):
return
def table_name(self):
return self.dbconn.prefix + "table"
def columns(self):
return {"test": ["integer", "PRIMARY KEY"]}
def column_names(self):
return sorted(self.columns().keys(), key = lambda x: x)
def primary_key(self):
return ['id']
def column_names_without_id(self):
res = sorted(self.columns().keys(), key = lambda x: x)
if 'id' in res:
res.remove('id')
return res
def table_constraints(self):
return []
def create(self):
sql = "CREATE TABLE " + self.table_name() + "("
arr = [k + " " + " ".join(v) for k, v in sorted(self.columns().items(), key = lambda x: x[0])]
sql += ", ".join(arr + self.table_constraints())
sql += ")"
cur = self.dbconn.conn.cursor()
cur.execute(sql)
self.dbconn.conn.commit()
return
def drop(self):
sql = "DROP TABLE IF EXISTS " + self.table_name()
cur = self.dbconn.conn.cursor()
cur.execute(sql)
self.dbconn.conn.commit()
return
def insert_one(self, vals):
for i in range(0, len(vals)):
if type(vals[i]) == str:
vals[i] = "'" + vals[i] + "'"
else:
vals[i] = str(vals[i])
sql = "INSERT INTO " + self.table_name() + "("
sql += ", ".join(self.column_names_without_id()) + ") VALUES("
sql += ", ".join(vals) + ")"
cur = self.dbconn.conn.cursor()
cur.execute(sql)
self.dbconn.conn.commit()
return
def first(self):
sql = "SELECT * FROM " + self.table_name()
sql += " ORDER BY "
sql += ", ".join(self.primary_key())
cur = self.dbconn.conn.cursor()
cur.execute(sql)
return cur.fetchone()
def last(self):
sql = "SELECT * FROM " + self.table_name()
sql += " ORDER BY "
sql += ", ".join([x + " DESC" for x in self.primary_key()])
cur = self.dbconn.conn.cursor()
cur.execute(sql)
return cur.fetchone()
def all(self):
sql = "SELECT * FROM " + self.table_name()
sql += " ORDER BY "
sql += ", ".join(self.primary_key())
cur = self.dbconn.conn.cursor()
cur.execute(sql)
return cur.fetchall()
+182
View File
@@ -0,0 +1,182 @@
import sys
sys.path.append('tables')
from project_config import *
from dbconnection import *
from people_table import *
from phones_table import *
class Main:
config = ProjectConfig()
connection = DbConnection(config)
def __init__(self):
DbTable.dbconn = self.connection
return
def db_init(self):
pt = PeopleTable()
pht = PhonesTable()
pt.create()
pht.create()
return
def db_insert_somethings(self):
pt = PeopleTable()
pht = PhonesTable()
pt.insert_one(["Test", "Test", "Test"])
pt.insert_one(["Test2", "Test2", "Test2"])
pt.insert_one(["Test3", "Test3", "Test3"])
pht.insert_one([1, "123"])
pht.insert_one([2, "123"])
pht.insert_one([3, "123"])
def db_drop(self):
pht = PhonesTable()
pt = PeopleTable()
pht.drop()
pt.drop()
return
def show_main_menu(self):
menu = """Добро пожаловать!
Основное меню (выберите цифру в соответствии с необходимым действием):
1 - просмотр людей;
2 - сброс и инициализация таблиц;
9 - выход."""
print(menu)
return
def read_next_step(self):
return input("=> ").strip()
def after_main_menu(self, next_step):
if next_step == "2":
self.db_drop()
self.db_init()
self.db_insert_somethings()
print("Таблицы созданы заново!")
return "0"
elif next_step != "1" and next_step != "9":
print("Выбрано неверное число! Повторите ввод!")
return "0"
else:
return next_step
def show_people(self):
self.person_id = -1
menu = """Просмотр списка людей!
\tФамилия\tИмя\tОтчество"""
print(menu)
lst = PeopleTable().all()
for i in lst:
print(str(i[1]) + "\t" + str(i[2]) + "\t" + str(i[0]) + "\t" + str(i[3]))
menu = """Дальнейшие операции:
0 - возврат в главное меню;
3 - добавление нового человека;
4 - удаление человека;
5 - просмотр телефонов человека;
9 - выход."""
print(menu)
return
def after_show_people(self, next_step):
while True:
if next_step == "4":
print("Пока не реализовано!")
return "1"
elif next_step == "6" or next_step == "7":
print("Пока не реализовано!")
next_step = "5"
elif next_step == "5":
next_step = self.show_phones_by_people()
elif next_step != "0" and next_step != "9" and next_step != "3":
print("Выбрано неверное число! Повторите ввод!")
return "1"
else:
return next_step
def show_add_person(self):
# Не реализована проверка на максимальную длину строк. Нужно доделать самостоятельно!
data = []
data.append(input("Введите имя (1 - отмена): ").strip())
if data[0] == "1":
return
while len(data[0].strip()) == 0:
data[0] = input("Имя не может быть пустым! Введите имя заново (1 - отмена):").strip()
if data[0] == "1":
return
data.append(input("Введите фамилию (1 - отмена): ").strip())
if data[1] == "1":
return
while len(data[1].strip()) == 0:
data[1] = input("Фамилия не может быть пустой! Введите фамилию заново (1 - отмена):").strip()
if data[1] == "1":
return
data.append(input("Введите отчество (1 - отмена):").strip())
if data[2] == "1":
return
PeopleTable().insert_one(data)
return
def show_phones_by_people(self):
if self.person_id == -1:
while True:
num = input("Укажите номер строки, в которой записана интересующая Вас персона (0 - отмена):")
while len(num.strip()) == 0:
num = input("Пустая строка. Повторите ввод! Укажите номер строки, в которой записана интересующая Вас персона (0 - отмена):")
if num == "0":
return "1"
person = PeopleTable().find_by_position(int(num))
if not person:
print("Введено число, неудовлетворяющее количеству людей!")
else:
self.person_id = int(person[1])
self.person_obj = person
break
print("Выбран человек: " + self.person_obj[2] + " " + self.person_obj[0] + " " + self.person_obj[3])
print("Телефоны:")
lst = PhonesTable().all_by_person_id(self.person_id)
for i in lst:
print(i[1])
menu = """Дальнейшие операции:
0 - возврат в главное меню;
1 - возврат в просмотр людей;
6 - добавление нового телефона;
7 - удаление телефона;
9 - выход."""
print(menu)
return self.read_next_step()
return self.read_next_step()
def main_cycle(self):
current_menu = "0"
next_step = None
while(current_menu != "9"):
if current_menu == "0":
self.show_main_menu()
next_step = self.read_next_step()
current_menu = self.after_main_menu(next_step)
elif current_menu == "1":
self.show_people()
next_step = self.read_next_step()
current_menu = self.after_show_people(next_step)
elif current_menu == "2":
self.show_main_menu()
elif current_menu == "3":
self.show_add_person()
current_menu = "1"
print("До свидания!")
return
def test(self):
DbTable.dbconn.test()
m = Main()
# Откоментируйте эту строку и закоментируйте следующую для теста
# соединения с БД
# m.test()
m.main_cycle()
+21
View File
@@ -0,0 +1,21 @@
# Загрузка настроек проекта (в данном случае только настроек соединения с БД)
# из файла config.yaml.
import yaml
class ProjectConfig:
"""Класс считывает базовые настройки из файла config.yaml"""
def __init__(self):
with open('config.yaml') as f:
config = yaml.safe_load(f)
self.dbname = config['dbname']
self.user = config['user']
self.password = config['password']
self.host = config['host']
self.dbtableprefix = config['dbtableprefix']
# Этот метод запускается только, если запускать
# данный файл, а не подключать его.
if __name__ == "__main__":
x = ProjectConfig()
print(x.dbfilepath)
@@ -0,0 +1,23 @@
# Таблица персоны и особые действия с ней
from dbtable import *
class PeopleTable(DbTable):
def table_name(self):
return self.dbconn.prefix + "people"
def columns(self):
return {"id": ["serial", "PRIMARY KEY"],
"last_name": ["varchar(32)", "NOT NULL"],
"first_name": ["varchar(32)", "NOT NULL"],
"second_name": ["varchar(32)"]}
def find_by_position(self, num):
sql = "SELECT * FROM " + self.table_name()
sql += " ORDER BY "
sql += ", ".join(self.primary_key())
sql += " LIMIT 1 OFFSET %(offset)s"
cur = self.dbconn.conn.cursor()
cur.execute(sql, {"offset": num - 1})
return cur.fetchone()
@@ -0,0 +1,27 @@
# Таблица Телефоны и особые действия с ней.
from dbtable import *
class PhonesTable(DbTable):
def table_name(self):
return self.dbconn.prefix + "phones"
def columns(self):
return {"person_id": ["integer", "REFERENCES people(id)"],
"phone": ["varchar(12)", "NOT NULL"]}
def primary_key(self):
return ['person_id', 'phone']
def table_constraints(self):
return ["PRIMARY KEY(person_id, phone)"]
def all_by_person_id(self, pid):
sql = "SELECT * FROM " + self.table_name()
sql += " WHERE person_id = %s"
sql += " ORDER BY "
sql += ", ".join(self.primary_key())
cur = self.dbconn.conn.cursor()
cur.execute(sql, str(pid))
return cur.fetchall()
+11
View File
@@ -0,0 +1,11 @@
# import sys
# sys.path.append('tables')
# from project_config import *
# from dbconnection import *
# # from tables.people_table import *
# # from tables.phones_table import *
# from tables.dish_table import *
# from tables.cath_table import *
# cath = CathTable().find_by_name('За')
+1
View File
@@ -0,0 +1 @@
SELECT * FROM dish;