Идея написания простой базы данных на Python появилась случайно, но это была одна из тех идей, которые мне захотелось реализовать.
В написании кода ядра я не использовал взаимодейсвия с файлами, база данных во время работы программы находится в списке, а функция, необходимая для её сохранения или парсер, превращает список в строку или наоборот соответственно. Сделано это для удобства переноса кода на другие языки программирования.
РЕКОМЕНДУЕМ:
Как сделать свою структуру данных в Python совместимой с фичами
Начать я решил с написания функций необходимых для взаимодействия с базой данных, таких как создание базы данных или парсинг уже созданной базы данных. Функции получили название init и parse.
Функция init возвращает список, содержащий информацию о количестве столбцов в коде, количество строк вычисляется по формуле:
<strong>общее_количество_яйчеек_с_информацией/количество_столбцов</strong>
Функция parse принимает строку, а возвращает список с базой данных.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
def init(): dblist = [1] #$ return dblist def parse(string): dblist = [] var = '' x = 0 y = len(string) #- if(string[y - 1] == '!'): while(x != y): while(string[x] != '!'): #- var += string[x] x += 1 dblist += [var] var = '' x += 1 #- var = dblist[0] dblist[0] = int(var) #$ return dblist else: return '$err' |
Переменная dblist — это и есть база данных, функции изменяющие БД принимают этот список в качестве параметра, изменяют и возвращают.
Неудобно, не находите?
Также вы могли заметить, что функция parse может вернуть ошибку, обработчик этих ошибок мы тоже разберем.
Далее написаны были функции записи и чтения из БД.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
def write(dblist, pos, data): leN = len(dblist) leN -= 1 #- if (pos > leN): while(leN != pos): #- dblist.append(' ') leN += 1 #- dblist[pos] = data else: #- dblist[pos] = data #$ return dblist def read(dblist, pos): leN = len(dblist) if (pos > leN): #$ return '$err' else: #$ return dblist[pos] |
Функция read тоже может вернуть ошибку при неверно указанной позиции данных.
Самыми короткими оказались функции создания и удаления столбца.
1 2 3 4 5 6 7 8 9 |
def mkcol(dblist): dblist[0] += 1 #$ return dblist def delcol(dblist): dblist[0] -= 1 #$ return dblist |
И наконец — функция сохранения всего этого в строку.
1 2 3 4 5 6 7 8 9 |
def save(string, dblist): x = 0 while(x != len(dblist)): #- string += str(dblist[x]) string += '!' #- x += 1 return string |
Весь код целиком можно посмотреть на GitHub.
Также не забываем про обработчик ошибок. В случае если функция возвращает ошибку, он отображает ее суть в консоль. Его я вынес в отдельный файл.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
import core as db # "ERR_PARSE_END-OF-DB" # "ERR_READ_POS" def init(): return db.init() def parse(string): ret = db.parse(string) if ret == '$err': print("ERR_PARSE_END-OF-DB") else: return ret def save(string, dblist): return save(string, dblist) def mkcol(dblist): return db.mkcol(dblist) def delcol(dblist): return db.delcol(dblist) def write(dblist, pos, data): return db.write(dblist, pos, data) def read(dblist, pos): ret = db.read(dblist, pos) if ret == '$err': print('ERR_READ_POS') else: return ret |
Полностью посмотреть весь код проекта, а также помочь в усовершенствовании вы можете в репозитории на github.
РЕКОМЕНДУЕМ:
Обработка сложных форм на Python с помощью WTForms
Использовать эту базу данных можно, например, для сохранения данных о персонажах и объектах в небольших самописных видеоиграх.