Как за считанные минуты написать простую игрушечную базу данных на Python
MySQL, PostgreSQL, Oracle, Redis - все это вы называете просто базами данных, но, на самом деле, они являются крайне важным технологическим элементом в развитии человеческой цивилизации. Сегодня мы все понимаем, насколько ценны данные, а отсюда понимаем и важность обеспечения безопасности и стабильности - вот, где без хорошей базы данных никуда!
Мы увидели, насколько важны базы данных. Я давно думал о создании My Own Toy Database, чтобы разобраться, поиграть и поэкспериментировать с ней. Как сказал Ричард Фейнман:
" Я не понимаю того, что не могу создать сам "
И так, давайте уже без лишних разговоров перейдем к самой интересной части: кодированию.
Начнем писать код ...
Для этой игрушечной базы данных мы будем использовать Python (мой любимый ❤️). Я назвал эту базу данных FooBarDB (я не смог придумать другое имя 😉), но вы можете придумать другое название!
Итак, для начала давайте добавим некоторые импорты из стандартной библиотеки Python:
import json import os
Да, нам понадобятся только эти две библиотеки! Нам нужен json, так как наша база данных будет основана на JSON, а os - для некоторых вещей, связанных с настройкой paths.
Теперь давайте определим основной класс FoobarDB, который будет иметь некоторые довольно простые функции, работу которых я объясню ниже.
class FoobarDB(object): def __init__(self , location): self.location = os.path.expanduser(location) self.load(self.location) def load(self , location): if os.path.exists(location): self._load() else: self.db = {} return True def _load(self): self.db = json.load(open(self.location , "r")) def dumpdb(self): try: json.dump(self.db , open(self.location, "w+")) return True except: return False
Здесь мы определили основной класс с функцией __init__. При создании базы данных Foobar нам нужно только указать ее местоположение. В первой функции __init__ мы берем параметр местоположения и заменяем тильду ~ или ~user на домашний каталог пользователя, что будет обеспечивать работу должным образом. И, наконец, поместите местоположение в переменную self.location для последующего доступа из тех же функций класса. Далее мы вызываем функцию загрузки, передавая self.location в качестве аргумента.
. . . . def load(self , location): if os.path.exists(location): self._load() else: self.db = {} return True . . . .
В этой функции загрузки мы уже возьмем расположение базы данных в качестве параметра. Затем проверим, существует база данных или нет. Если она существует, мы запускаем функцию _load() (объяснено ниже как она работает). В противном случае мы создаем пустой JSON объект в памяти. И наконец, вернем true в случае успешного выполнения
. . . . def _load(self): self.db = json.load(open(self.location , "r")) . . . .
В функции _load мы просто открываем файл базы данных из местоположения, которое получаем из переменной self.location. Затем мы преобразуем его в JSON объект и загружаем в переменную self.db.
. . . . def dumpdb(self): try: json.dump(self.db , open(self.location, "w+")) return True except: return False. . . .
И, наконец, функция dumpdb: название говорит само за себя. Функция берет резидентную базу данных (на самом деле объект JSON) из переменной self.db и сохраняет ее в файле базы данных! Возвращает True если сохранение прошло успешно, иначе возвращает False.
Сделаем базу данных чуточку удобнее ... 😉
Подождите минуту! Не правда ли база данных бесполезна, если не может хранить и извлекать данные? Так пойдем и добавим эту функциональность ... 😎
. . . . def set(self , key , value): try: self.db[str(key)] = value self.dumpdb() return True except Exception as e: print("[X] Error Saving Values to Database : " + str(e)) return False def get(self , key): try: return self.db[key] except KeyError: print("No Value Can Be Found for " + str(key)) return False def delete(self , key): if not key in self.db: return False del self.db[key] self.dumpdb() return True . . . .
Функция set - нужна для добавления данных в базу данных. Поскольку наша база данных реализована по простому принципу хранилища значений, доступ к которым осуществляется по ключу (key/value store), в качестве аргументов мы будем использовать только ключ и значение.
Сначала мы попытаемся добавить ключ и значение в базу данных, а затем сохранить ее. В случае успешно выполнения, получаем True. В противном случае мы получим сообщение об ошибке и False. (Мы не хотим, чтобы программа стирала наши данные каждый раз, когда происходит ошибка 😎).
. . . . def get(self, key): try: return self.db[key] except KeyError: return False . . . .
get - это простая функция, мы берем ключ в качестве аргумента и пытаемся вернуть значение из базы данных. В противном случае получаем False с сообщением о ошибке.
. . . . def delete(self , key): if not key in self.db: return False del self.db[key] self.dumpdb() return True. . . .
Функция delete предназначается для удаления ключа и его значения из базы данных. Сначала убедитесь, что ключ присутствует в базе данных. Если нет, получаем False. Иначе мы удаляем ключ с помощью встроенной переменной del, которая автоматически удаляет его значение. Далее мы сохраняем базу данных и она возвращает false.
Вы можете подумать, а что если я создал большую базу данных и захочу сбросить ее? Теоретически, мы можем использовать функцию delete, но это не практично, а также затратно по времени! ⏳ Поступим лучше и создадим специальную функцию для этой задачи...
. . . . def resetdb(self): self.db={} self.dumpdb() return True . . . .
Встречайте! функция сброса данных resetdb! Создать ее довольно просто: во-первых, мы переопределяем нашу резидентную базу данных c пустым объектом JSON, который она просто сохраняет! И на этом все! Наша база данных теперь снова чиста.
Резюмирую ... 🎉
Вот и все, друзья! Мы создали нашу собственную игрушечную базу данных ! 🎉🎉 На самом деле, FoobarDB - это просто демонстрационная версия базы данных. Ее можно сравнить с дешевеньким набором игрушек «Сделай сам»: вы можете улучшить ее, изменить так как захотите. Вы также можете добавить множество других функций в соответствии с вашими потребностями и требованиями к программе.
Вы можете посмотреть код на гитхабе bauripalash / foobardb
Перевод статьи: How to write a simple toy database in Python within minutes