У вас включен AdBlock или иной блокировщик рекламы.

Пожалуйста, отключите его, доход от рекламы помогает развитию сайта и появлению новых статей.

Спасибо за понимание.

В другой раз
DevGang блог о програмировании
Авторизоваться

Как за считанные минуты написать простую игрушечную базу данных на 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

#Python
Присоеденяйся в тусовку

Будь всегдя вкурсе новостей из мира IT