From 32a35ea41975073c0f585e05623a8ba2a180bf72 Mon Sep 17 00:00:00 2001 From: ada-dmitry Date: Sun, 12 May 2024 22:57:10 +0300 Subject: [PATCH] added Renata files and developed beauty output --- 0.6_test/__pycache__/dbtable.cpython-311.pyc | Bin 8248 -> 8248 bytes 0.6_test/__pycache__/texts.cpython-311.pyc | Bin 1485 -> 1757 bytes 0.6_test/main.py | 42 ++- .../__pycache__/cath_table.cpython-311.pyc | Bin 2515 -> 4013 bytes .../__pycache__/dish_table.cpython-311.pyc | Bin 7216 -> 14407 bytes 0.6_test/tables/cath_table.py | 20 +- 0.6_test/tables/dish_table.py | 34 ++- 0.6_test/test.py | 1 + 0.6_test/texts.py | 19 +- .../__pycache__/dbconnection.cpython-311.pyc | Bin 0 -> 2168 bytes .../__pycache__/dbtable.cpython-311.pyc | Bin 0 -> 7625 bytes .../extra_functions.cpython-311.pyc | Bin 0 -> 1008 bytes .../project_config.cpython-311.pyc | Bin 0 -> 1393 bytes other/Renata/config.yaml | 6 + other/Renata/dbconnection.py | 34 +++ other/Renata/dbtable.py | 92 ++++++ other/Renata/extra_functions.py | 17 ++ other/Renata/main.py | 284 ++++++++++++++++++ other/Renata/project_config.py | 21 ++ .../countries_table.cpython-311.pyc | Bin 0 -> 3732 bytes .../__pycache__/racers_table.cpython-311.pyc | Bin 0 -> 5877 bytes other/Renata/tables/countries_table.py | 37 +++ other/Renata/tables/racers_table.py | 62 ++++ other/test.py | 4 + 24 files changed, 652 insertions(+), 21 deletions(-) create mode 100644 0.6_test/test.py create mode 100644 other/Renata/__pycache__/dbconnection.cpython-311.pyc create mode 100644 other/Renata/__pycache__/dbtable.cpython-311.pyc create mode 100644 other/Renata/__pycache__/extra_functions.cpython-311.pyc create mode 100644 other/Renata/__pycache__/project_config.cpython-311.pyc create mode 100644 other/Renata/config.yaml create mode 100644 other/Renata/dbconnection.py create mode 100644 other/Renata/dbtable.py create mode 100644 other/Renata/extra_functions.py create mode 100644 other/Renata/main.py create mode 100644 other/Renata/project_config.py create mode 100644 other/Renata/tables/__pycache__/countries_table.cpython-311.pyc create mode 100644 other/Renata/tables/__pycache__/racers_table.cpython-311.pyc create mode 100644 other/Renata/tables/countries_table.py create mode 100644 other/Renata/tables/racers_table.py diff --git a/0.6_test/__pycache__/dbtable.cpython-311.pyc b/0.6_test/__pycache__/dbtable.cpython-311.pyc index 1d2d43ec723be5d37f2eb3a474088208f782d57d..5344175f57e9e18d475a05d711808bfbd8d3a935 100644 GIT binary patch delta 27 hcmdntu)~3SIWI340}%Y@cihOW$;fE7*_4r49sp%720j1) delta 27 hcmdntu)~3SIWI340}yPNv)ah5$;fEB*_4r49spsd1^oa3 diff --git a/0.6_test/__pycache__/texts.cpython-311.pyc b/0.6_test/__pycache__/texts.cpython-311.pyc index 4a4f964ea6904188baad79191d4b89f466665f81..74baffb6548e375e2aac353f8f4b74bd82c9d79b 100644 GIT binary patch delta 467 zcmX@heV3PSIWI340}w>WIi`iMP2`hMkOK0iGo&y?F{Cg?F{Us@F{Lm^F{iLZv81pD zGib6+bh^a2XtF5d{K*B3Y?HSzMuF(fd`uFI#=9xIo1_FZhau;XH%{)LSf zc3Idc*b5{#fdnr0*mD_z+%gN@$y`Pt;fXM3 zb6uDO)Ug%l1E?{3fgGSw5D#3~abeHJ=8Js_7u$gHEpitdE;cIw)$YF74|W33N>E5_ zuu|ai(`212!0Ih>OQFUV`7$YXjF{w{}$NWNi#frC+~fU$w^0~?!=IFJ%xlN7(e LAPPZ6>_FuJ4)ay* diff --git a/0.6_test/main.py b/0.6_test/main.py index 7207ec2..a6aee03 100644 --- a/0.6_test/main.py +++ b/0.6_test/main.py @@ -1,5 +1,6 @@ import sys import texts +# import time sys.path.append('tables') from project_config import * @@ -13,7 +14,8 @@ TODO: 1) Реализовать ввод порядкового номера - done 2) Удалить проверки на "русскоязычный ввод" - done 3) Устранить SQLi с помощью санации атрибутов - done -4) UPDATE для отдельный таблиц/общий? - indev +4) UPDATE для отдельных таблиц - indev +5) Красивый вывод - done FIXME: ''' @@ -111,8 +113,18 @@ class Main: else: DishTable().delete(self.dish_arr[x-1][0]) next_step = "5" + elif next_step == "5": next_step = self.show_dish_in_cath() + + elif next_step == "8": + x = int(input(texts.text_choice_update)) + if(x==1): + self.cath_update() + elif(x==2): + self.dish_update() + return "1" + elif next_step != "0" and next_step != "9" and next_step != "3": print("Выбрано неверное число! Повторите ввод!") return "1" @@ -160,16 +172,28 @@ class Main: print("Выбрана категория: " + self.cath_obj) print("Блюда:") - print("№\tНазвание\tВремя приготовления\tКраткая инструкция\ - \n-------------------------------------------------------------------------------------") + lst = DishTable().all_by_cath_id(self.cath_id) - + self.max_len_name = 0 + self.max_index = len(lst) for i in lst: self.dish_arr.append([i[2], str(i[1]), str(i[4])]) - + self.max_len_name = max(self.max_len_name, len(i[2])) + print("№" + " "*(self.max_index + 1)+ "Название" + " "*(self.max_len_name - 4)\ + +"Время приготовления Краткая инструкция\ + \n-------------------------------------------------------------------------------------------") + # print('Катя хорошая и Дима тоже') for i in range(len(self.dish_arr)): - print(str(i+1) + "\t" + self.dish_arr[i][0] + "\t\t" + self.dish_arr[i][1] + "\t\t\t" + self.dish_arr[i][2]) - + txt = str(i+1) + " "*(2+self.max_index-len(str(i))) + txt += self.dish_arr[i][0] + " "*(4+self.max_len_name - len(self.dish_arr[i][0])) + txt += self.dish_arr[i][1] + " "*(5+19-len(self.dish_arr[i][1])) + txt += self.dish_arr[i][2] + # txt += self.dish_arr[i][0] + + # print(f"""{str(i+1):<8}{self.dish_arr[i][0]:<18}\ + # {self.dish_arr[i][1]:<15}{self.dish_arr[i][2]}""") +# print(f"""{str(i+1)}{" "*(self.max_index+2)}\ +# {self.dish_arr[i][0]}{" "*(self.max_len_name+2)}{self.dish_arr[i][1]}{" "*19}{self.dish_arr[i][2]}""") + print(txt) menu = texts.show_dish_in_cath_txt print(menu) return self.read_next_step() @@ -199,10 +223,6 @@ class Main: self.add_cath() current_menu = "1" - elif current_menu == "8": - self.update_cath() - current_menu = "1" - print("До свидания!") return diff --git a/0.6_test/tables/__pycache__/cath_table.cpython-311.pyc b/0.6_test/tables/__pycache__/cath_table.cpython-311.pyc index 377335fae4e92a7d9b3ad971622dda7251342687..273c17d357ace9875c79682ca54e148a79ec4434 100644 GIT binary patch delta 964 zcmZ{jOKTHR6vyYDQdrJgFJb3~Gin!*BL8j9tD5moV-cH;v?+{9vvXoe+z-gDomy z3){3oWhbDd*DRHlOqD^-d#qy*_o;$iY!9S2ENKh2vF@n-@e@l2SZ9;2BKft19k!JQ zmMyAsl@>kG7AR^DZD5b8qXJzu#OQN}3zWHM-HEEycU0r4I$Wd`#|9qI3)~yUKC;?4 z9$QepEncq4qjlKb#(mFS)b=wf<<+QKoa5i)JW++m-sC|n-5I<3hPfY@KAp$hwdTZh52~td_)v!nn8OX^5A%k($|(;ULY{@|avA1> zi)fuENV3+sLQP$Y{FRh%t|uHxVe>!0>^CLDaT`bMitq@y&-= zt}rr6O`gtH%GAX$nUB4LErlVNL6c>22bbPtD;^JaO`w)ySBA-*JT8+h`BoTnuqu6E tfDDx5R1qK0Y5<^7Fm3<< diff --git a/0.6_test/tables/__pycache__/dish_table.cpython-311.pyc b/0.6_test/tables/__pycache__/dish_table.cpython-311.pyc index 1ee25bb048fda09338115a3e82a142cd5ac47612..5833efa001640e54e6b1658bb4bb8dcc838f9b66 100644 GIT binary patch literal 14407 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 literal 0 HcmV?d00001 diff --git a/other/Renata/__pycache__/dbtable.cpython-311.pyc b/other/Renata/__pycache__/dbtable.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..23a26dd89fa685172e4fa88dd8312d50d78fcac2 GIT binary patch literal 7625 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 GC-@DNY~Qv3 literal 0 HcmV?d00001 diff --git a/other/Renata/__pycache__/project_config.cpython-311.pyc b/other/Renata/__pycache__/project_config.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f5d2836ea41861d2e09588f2fe2eec4f5b74af5d GIT binary patch literal 1393 zcmZ`&&ube;6n?Wi`e8>~lNQH6aKpNV6qVLcLP=suLDXp}rB12oA*$%G){GiC@~%3& zjveEGVnU-3A95(TlpcI?TLL8wgg6NaCkV-<^1bLiYBUpbfp83?jIy77EG4WrLw>yfVdiyUJftY2v^lkxE@|tx796mCtSDH zU+CObkJN1p-m%rgICVX2VCbH@uXb#;qwd<_6->LQ3)$tk^wdRXu~trGX^m-|c!;nI z7~O>60LMxHWb-^6G4Ih9{myH$kEG!cOXL0LYCZCyIJ#^rtqBNg(okbDR zC11!WTX%ea*^@k?=R7}%EIuDN^EFYIqEcPSXCvy>g&R?Q$kBlBR0OMe4wqW3)WT#| z!+-|e!g({IzNl3qQi;;t*ZTULY}_MLIa*yhi|+eT6W8_JCGhYwN-dB zJoeLfTZM4=SZnxL^V9aYy*1hzf44ca@kM*|=+75^eGT2u+Y@hXO}8ed(Esvac=Da! zhgy>-n=`H4(T;@$3 zbZ91pdw3b7{>N1v3%UlwbZ=e^El_*u0RX2zR`Fy2{?c)UJOZ`#$b%c&d2aY|Q|4GZJKVIc h4Q&iH3T-;jINhAwcrT ").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_countries(self): + self.country_id = -1 + menu = """Просмотр списка стран! +№\tНазвание страны""" + print(menu) + lst = CountriesTable().allbyname() + for index, i in enumerate(lst): + print(str(index+1) + "\t" + i[1]) + menu = """Дальнейшие операции: + 0 - возврат в главное меню; + 3 - добавление новой страны; + 4 - удаление страны; + 5 - просмотр гонщиков, родившихся в этой стране; + 9 - выход.""" + print(menu) + return + + def after_show_countries(self, next_step): + while True: + if next_step == "4": + self.delete_country() + return "1" + elif next_step == "5": + next_step = self.after_show_racers(self.show_racers_by_countries()) + elif next_step != "0" and next_step != "9" and next_step != "3": + print("Выбрано неверное число! Повторите ввод!") + return "1" + else: + return next_step + def after_show_racers(self, next_step): + while True: + if next_step == "3": + self.insert_new_racer() + elif next_step == "4": + self.delete_racer() + elif next_step == "0" or next_step == "9" or next_step == "1": + return next_step + else: + print('Ввели неверное число') + return "5" + + def delete_country(self): + num = input("Введите номер строки, в которой находится страна, которую вы хотите удалить (0 - отмена): ").strip() + if num == "0": + return + while len(num) == 0 or not(num.isdigit()) or not(CountriesTable().find_by_position(int(num))): + if len(num) == 0: + text = "Номер строки не пустое значение!" + elif not(num.isdigit()): + text = "Номер строки это положительное ЧИСЛО!" + else: + text = "Номер строки вне диапазона!" + num = input(text + " Введите номер строки снова (0 - отмена): ").strip() + if num == "0": + return + self.country_id = int(CountriesTable().find_by_position(int(num))[0]) + RacersTable().delete_by_cid(self.country_id) + CountriesTable().delete_by_cid(self.country_id) + def show_add_country(self): + data = input("Введите название страны (-1 - отмена): ").strip() + if data == "-1": + return + while len(data) == 0 or len(data) > 64 or CountriesTable().findbyname(data): + if len(data) == 0: + text = "Название страны не пустое!" + elif len(data) > 64: + text = "Название страны не превышает 64 значения!" + else: + text = "Такая страна уже есть в таблице!" + data = input(text + " Введите название страны снова (-1 - отмена): ").strip() + if data == "-1": + return + CountriesTable().insert_one([data]) + + def show_racers_by_countries(self): + if self.country_id == -1: + num = input("Укажите номер строки, в которой записана интересующая Вас персона (0 - отмена): ").strip() + while len(num) == 0 or not(num.isdigit()) or not(CountriesTable().find_by_position(int(num))): + if len(num) == 0: + text = "Номер строки не пустое значение!" + elif not(num.isdigit()): + text = "Номер строки это положительное ЧИСЛО!" + else: + text = "Номер строки вне диапазона!" + num = input(text + " Введите номер строки снова (0 - отмена): ").strip() + if num == "0": + return + country = CountriesTable().find_by_position(int(num)) + self.country_id = int(country[0]) + self.country_name = country[1] + print("Выбрана страна: " + self.country_name) + print("Гонщики:") + lst = RacersTable().all_by_country_id(self.country_id) + self.rac_max_len = len(str(len(lst))) + self.max_sur_len = max_len(lst, 4) + self.max_name_len = max_len(lst, 2) + menu = "№" + " "*(self.rac_max_len + 1)+ "Фамилия" + " "*(self.max_sur_len - 5) +"Имя" + " "*(self.max_name_len - 1) +"День рождения Количество побед" + print(menu) + for index, i in enumerate(lst): + text = str(index+1) + " "*(self.rac_max_len-len(str(index+1))+2)+i[4]+ \ + " "*(self.max_sur_len-len(i[4])+2)+i[2]+ " "*(self.max_name_len-len(i[2])+2) + text += str(i[0]) + " "*5+str(i[5]) + print(text) + menu = """Дальнейшие операции: + 0 - возврат в главное меню; + 1 - возврат в просмотр стран; + 3 - добавление нового гонщика; + 4 - удаление гонщика; + 9 - выход.""" + print(menu) + return self.read_next_step() + + def insert_new_racer(self): + while True: + data = [] + data.append(input("Введите имя гонщика (-1 - отмена): ").strip()) + if data[0] == "-1": + return + while len(data[0]) == 0 or len(data[0]) > 64: + if len(data[0]) == 0: + text = 'Имя не может быть пустым!' + else: + text = 'Имя превышает 64 символа!' + data[0] = input(text + " Введите имя заново (-1 - отмена): ").strip() + if data[0] == "-1": + return + data.append(input("Введите фамилию гонщика (-1 - отмена): ").strip()) + if data[1] == "-1": + return + while len(data[1]) == 0 or len(data[1]) > 64: + if len(data[1]) == 0: + text = 'Фамилия не может быть пустым!' + else: + text = 'Фамилия не превышает 64 символа!' + data[1] = input(text + " Введите фамилию заново (-1 - отмена): ").strip() + if data[1] == "-1": + return + data.append(input("Введите день рождения гонщика в формате (ГГГГ-ММ-ДД)(1976-04-03 - 3 апреля 1976 года), причем гонщику должно быть меньше 60 лет (-1 - отмена): ").strip()) + if data[2] == "-1": + return + while len(data[2]) == 0 or check_format(data[2]) or RacersTable().checkbirthday(data[2])[0]: + if len(data[2]) == 0: + text = 'День рождения не может быть пустым!' + elif check_format(data[2]): + text = 'Строка не соответствует формату дня рождения!' + else: + text = 'Гонщику больше 60 лет!' + data[2] = input(text + " Введите день рождения гонщика заново (ГГГГ-ММ-ДД) (-1 - отмена): ").strip() + if data[2] == "-1": + return + self.racer = RacersTable().select_by_s_n_b(data) + if not(self.racer): + break + print('Такой гонщик уже есть!', end = ' ') + data.append(self.country_id) + data[2], data[0], data[1], data[3] = data[0], data[2], data[3], data[1] + data.append(input("Введите количество побед гонщика (пробелы - значение по умолчанию: 0)(-1 - отмена): ").strip()) + if data[4] == "-1": + return + if len(data[4]) == 0: + RacersTable().insertbydef(data[:-1]) + return + while not(data[4].isdigit()): + text = "Количество побед это Положительное ЧИСЛО!" + data[4] = input(text + " Введите количество побед снова (-1 - отмена): ").strip() + if data[4]== "-1": + return + RacersTable().insert_one(data) + + def delete_racer(self): + num = input("Введите номер строки, в которой находится гонщик, которого вы хотите удалить (0 - отмена): ").strip() + if num == "0": + return + while len(num) == 0 or not(num.isdigit()) or not(RacersTable().find_by_position(self.country_id, int(num))): + if len(num) == 0: + text = "Номер строки не пустое значение!" + elif not(num.isdigit()): + text = "Номер строки это положительное ЧИСЛО!" + else: + text = "Номер строки вне диапазона!" + num = input(text + " Введите номер строки снова (0 - отмена): ").strip() + if num == "0": + return + RacersTable().delete_by_rid(int(RacersTable().find_by_position(self.country_id, int(num))[3])) + 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_countries() + next_step = self.read_next_step() + current_menu = self.after_show_countries(next_step) + elif current_menu == "2": + self.show_main_menu() + elif current_menu == "3": + self.show_add_country() + current_menu = "1" + print("До свидания!") + return + + def test(self): + DbTable.dbconn.test() + +m = Main() +# Откоментируйте эту строку и закоментируйте следующую для теста +# соединения с БД +# m.test() +m.main_cycle() + diff --git a/other/Renata/project_config.py b/other/Renata/project_config.py new file mode 100644 index 0000000..2b451e5 --- /dev/null +++ b/other/Renata/project_config.py @@ -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) diff --git a/other/Renata/tables/__pycache__/countries_table.cpython-311.pyc b/other/Renata/tables/__pycache__/countries_table.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0cc42ab2b0c7b3dd252282d1ac19960b947c96ec GIT binary patch literal 3732 zcmdT{PfQe77=QC;mthwMi=x;mp zDhJb0Ln1XzAl63gfof?|k3D*9dYUDhNG9o}J$a*{CrLw z!y}lB^`&c|)@nQ~%-HH-O{X#%P9_qjbBwBy=(Wd;$!lsXqT&0}YESsX;IO7rE!dM# zsCqRxm{9v@^oknnQ?*N}AY}|BNH8~NAtNPATXS&w9 zcrd5c15A*mx~)@Rj<`7kq;O$u~SOU^<6={htkcVMAQD z594xFF?n3|V?wLJj=dw)4OO!$oQ$R82~FQ#=1~556^?HO0B@SxA2k`fKUiu!W?0uU z$8M=#CN@;p(^?o-;vMe1<(&W(^zJ-ku}9y4Hru;8=XF+f*>>3!T6)#wtI^bjWI6>}=sFrphC?x}8!GmjB3RMT)CBpZXM$K833fQ(z@o~- zg9ei{r79G4YVy#bnNF(4lUGy^OOXeYqpGIi4oH$MtsO70ukYF1I#Etq55NTZUEDSu zm@~#htk|6syC=CN!F|Vd+ckYOD@Zv(G6ZR< zu71*GE2GE`Oo`4~%2D>s*GL zLv>b^3}oaCqd0Wf(KblN+YXcteQYYJ{Y-3I6x*_5 zdroY(h2g&Kp6;FPnCpGi^6;dwb6-~2pA+^Q!hX=moy_gbS2w0MP9rE3ODs>J@~UEi zRPg#TVKeLtWWrRW5q6W(;C!?d{LsZxJv?4VGi`$bbPqy1K%U-EEau@XdTA$i?FG-*SP#%Qr;JHF)yKq`-yQhD4E@p>tVS)nl}G#WzVM$8oh5p1CDEarZL z%BwQ>--daHiM)Pz^FDn?KD@)$IR(G*`8XG)Gaq~XUOUK-Nvmv|M!UfMLTK^|oO0GN zSQ?uy481&udG~B8DgJ(Jyo*e zCodPl+q2u(KG;IdlpCV^nb5o_G_Pqx5GS41ciiW3n}TeeYGm1T$#OiYq+=@7Yh?Ly zIuyhFBg^(j3y&)lQx267_8}ZVID~K*!8(TGS;P7`QKZKL%p2Miz(nzHnPnXBEt4WR zIR~77iy$zL-PoH4o^x!)-aH6Ab`-%?tXa>>n+`|aGN}Y>2dw4!Je*mjj9R}t%&NZ8 z0RC*TS6}K891!gt>ZbTJ4nOId7hsuV7-oqy7=>$@Z)Lz}B}||B3!nbIL6^0je*igf B8xjBj literal 0 HcmV?d00001 diff --git a/other/Renata/tables/__pycache__/racers_table.cpython-311.pyc b/other/Renata/tables/__pycache__/racers_table.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1d78c458bd6b388cd79dbc1ffd0e1252da3a4b12 GIT binary patch literal 5877 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 E2J8R!EdT%j literal 0 HcmV?d00001 diff --git a/other/Renata/tables/countries_table.py b/other/Renata/tables/countries_table.py new file mode 100644 index 0000000..17b1bce --- /dev/null +++ b/other/Renata/tables/countries_table.py @@ -0,0 +1,37 @@ +from dbtable import * + +class CountriesTable(DbTable): + def table_name(self): + return self.dbconn.prefix + '"Сountries"' + + def columns(self): + return {"country_id": ["serial", "PRIMARY KEY"], + "name": ["varchar(64)", "NOT NULL", "UNIQUE"] + } + def primary_key(self): + return ["country_id"] + def column_names_without_id(self): + res = sorted(self.columns().keys(), key = lambda x: x) + res.remove('country_id') + return res + def find_by_position(self, num): + sql = f"SELECT * FROM {self.table_name()} ORDER BY name LIMIT 1 OFFSET " + "%(offset)s" + cur = self.dbconn.conn.cursor() + cur.execute(sql, {"offset": num - 1}) + return cur.fetchone() + def allbyname(self): + sql = f"SELECT * FROM {self.table_name()} ORDER BY name" + cur = self.dbconn.conn.cursor() + cur.execute(sql) + return cur.fetchall() + def findbyname(self, data): + sql = f"SELECT country_id FROM {self.table_name()} WHERE name = "+ "%s" + cur = self.dbconn.conn.cursor() + cur.execute(sql, (data,)) + return cur.fetchall() + def delete_by_cid(self, cid): + sql = f"DELETE FROM {self.table_name()} WHERE country_id = " +"%s" + cur = self.dbconn.conn.cursor() + cur.execute(sql, (cid,)) + self.dbconn.conn.commit() + return \ No newline at end of file diff --git a/other/Renata/tables/racers_table.py b/other/Renata/tables/racers_table.py new file mode 100644 index 0000000..8045138 --- /dev/null +++ b/other/Renata/tables/racers_table.py @@ -0,0 +1,62 @@ +# Таблица Телефоны и особые действия с ней. + +from dbtable import * + +class RacersTable(DbTable): + def table_name(self): + return self.dbconn.prefix + '"Racers"' + + def columns(self): + return {"racer_id": ["serial", "PRIMARY KEY"], + "surname": ["varchar(64)", "NOT NULL"], + "name": ["varchar(64)", "NOT NULL"], + "birthday": ["date", "NOT NULL", "CHECK (extract(year from age(current_date, birthday)) < 60)"], + "country_id": ["integer", "NOT NULL", 'REFERENCES public."Сountries"(country_id) ON DELETE CASCADE'], + "wins": ["integer", "NOT NULL", "DEFAULT 0"]} + def table_constraints(self): + return ["UNIQUE (surname, name, birthday)"] + def primary_key(self): + return ["racer_id"] + def column_names_without_id(self): + res = sorted(self.columns().keys(), key = lambda x: x) + res.remove('racer_id') + return res + def all_by_country_id(self, cid): + sql = f"SELECT * FROM {self.table_name()} WHERE country_id = " + "%s ORDER BY surname, name, birthday" + cur = self.dbconn.conn.cursor() + cur.execute(sql, (cid,)) + return cur.fetchall() + def delete_by_cid(self, cid): + sql = f"DELETE FROM {self.table_name()} WHERE country_id = " +"%s" + cur = self.dbconn.conn.cursor() + cur.execute(sql, (cid,)) + self.dbconn.conn.commit() + return + def find_by_position(self, cid, num): + sql = f"SELECT * FROM {self.table_name()} WHERE "+ "country_id = %(cid)s ORDER BY surname, name, birthday LIMIT 1 OFFSET %(offset)s" + cur = self.dbconn.conn.cursor() + cur.execute(sql, {"cid": cid, "offset": num - 1}) + return cur.fetchone() + def delete_by_rid(self, rid): + sql = f"DELETE FROM {self.table_name()} WHERE racer_id = " +"%s" + cur = self.dbconn.conn.cursor() + cur.execute(sql, (rid,)) + self.dbconn.conn.commit() + return + def checkbirthday(self, val): + sql = "SELECT extract(year from age(current_date, %s)) >= 60" + cur = self.dbconn.conn.cursor() + cur.execute(sql, (val,)) + return cur.fetchone() + def select_by_s_n_b(self, vals): + sql = f"SELECT racer_id FROM {self.table_name()} WHERE name = " + "%s AND surname = %s AND birthday = %s" + cur = self.dbconn.conn.cursor() + cur.execute(sql, vals) + return cur.fetchone() + def insertbydef(self, vals): + sql = f"INSERT INTO {self.table_name()}(birthday, country_id, name, surname) VALUES "+"(%s,%s,%s,%s)" + cur = self.dbconn.conn.cursor() + print(vals) + cur.execute(sql, vals) + self.dbconn.conn.commit() + return \ No newline at end of file diff --git a/other/test.py b/other/test.py index 159aed8..287d012 100644 --- a/other/test.py +++ b/other/test.py @@ -9,3 +9,7 @@ # from tables.cath_table import * # cath = CathTable().find_by_name('За') +st = '2' +print('!\t!') +for i in range(30): + print('_', end="")