Язык программирования Python

Подключение к MySQL с помощью Peewee (ORM) в Python

Peewee – это ORM для Python, который позволяет работать с базами данных, не делая ручных запросов, и помогает сократить много времени за счет использования моделей. Peewee может не только подключаться к MariaDB, но и поддерживает другие движки.

В этой статье я покажу вам полный CRUD (создание, чтение, обновление и удаление) на языке Python с помощью Peewe на простом примере, который будет управлять словарем со словами и значениями.

Установка зависимостей

Для установки Python ORM нам, необходимо наличие интерпретатора Python и PIP. Чтобы установить его, выполните следующие действия:

pip install peewee

Нам также потребуется установить PyMySQL, потому что, хотя мы будем использовать ORM, внутри мы будем использовать собственное соединение:

pip install pymysql

После этого мы можем приступить к работе.

Базовая модель

Peewee (как и все ORM) работает с моделями. В основном модель представляет собой таблицу в базе данных, но конкретно в этом ORM нам нужно указать, какое подключение к базе данных будет использоваться, плюс она должна быть расширена из класса  Model .

Поэтому мы можем создать класс, который расширяется от  Model , определить базу данных, которую будут использовать все модели, а затем расширить модели на основе нашей базовой модели.

Это очень просто, с помощью следующего кода мы объявляем соединение и нашу базовую модель для работы с Peewee в Python:

from peewee import MySQLDatabase, Model, TextField DATABASE_NAME = "dictionary" USER = "root" PASSWORD = "" conexion = MySQLDatabase(DATABASE_NAME, user=USER, password=PASSWORD) class ModelBase(Model): class Meta: database = connection

Теперь мы можем создать несколько моделей, расширяющихся от базовой модели, и все они будут использовать одно и то же соединение.

Не забудьте указать пользователя, имя базы данных и пароль для подключения к MySQL.

Создание моделей и таблиц

Как я уже говорил, для этого примера мы будем управлять словарем, в котором будет слово и его значение. Таким образом, модель выглядит следующим образом:

class Word(ModelBase): word = TextField() meaning = TextField()

Как вы видите, у нас есть два поля: слово( word ) и значение( meaning ). Оба они относятся к текстовым типам данных, поэтому являются  TextField .

Для создания таблиц мы вызываем  create_tables  из соединения, уже полученного через Peewee. В данном случае я отправляю в список только класс модели.

def create_tables(): connection.connect() connection.create_tables([Word])
Code language: CSS (css)

Операции с базой данных

Пришло время познакомиться с операциями вставки, удаления, обновления и получения. Существует несколько способов сделать это, я предпочитаю тот, который я покажу вам ниже:

def add_word(word, meaning): Word.create(word=word, meaning=meaning)

Для создания новых данных мы вызываем метод  create  модели, указывая имя значения и само значение.

А вот обновление выглядит следующим образом:

def edit_word(word, new_meaning): Word.update({Word.meaning: new_meaning}).where( Word.word == word).execute()

Когда мы вызываем  update , мы указываем поля, которые изменяются. Поскольку мы изменяем только значение (которое теперь будет  new_meaning ), мы указываем только одно поле.

Затем мы ограничиваем  update  с помощью  where  так, чтобы он обновлялся только там, где слово равно указанному. В конце мы вызываем команду  execute  для выполнения обновления.

Для удаления мы делаем следующее:

def delete_word(word): Word.delete().where(Word.word == word).execute()

Мы вызываем метод  delete  и также ограничиваем его с помощью  where .

Если мы хотим получить одно или несколько значений, вызываем  select  или  get .

def get_words(): return Word.select() def search_meaning_word(word): # peewee вызовет исключение, если не найдет совпадающих строк. try: return Word.select().where(Word.word == word).get().meaning except Exception: # Мы перехватываем это исключение, возвращая None, что означает, что такого слова не существует. return None
Code language: PHP (php)

То есть, чтобы выбрать все записи, мы вызываем  select . А чтобы ограничить поиск, мы вызываем  where , чтобы позже вызвать  get  (который вернет только одну строку).

Как сказано в комментариях, если строка не найдена, Peewee вернет исключение.

Собираем все вместе

Напишем простую программу.

def main(): create_tables() menu = """ a) Добавить новое слово b) Редактирование существующего слова c) Удалить существующее слово d) Смотрите список слов e) Значение слова f) Выход Select_words: """ election = "" while election != "f": election = input(menu) if election == "a": word = input("Введите слово: ") # Проверка наличия слова possible_meaning = search_meaning_word(word) if possible_meaning: print(f"Слово '{word}' уже существует") else: meaning = input("Введите значение: ") add_word(word, meaning) print("Слово добавлено") if election == "b": word = input("Введите слово, которое вы хотите отредактировать: ") new_meaning = input("Введите новое значение: ") edit_word(word, new_meaning) print("Слово обновлено") if election == "c": word = input("Введите слово для удаления: ") delete_word(word) if election == "d": words = get_words() print("=== Список слов ===") for word in words: # При чтении из базы данных данные возвращаются в виде массива, поэтому необходимо вывести первый элемент. print(word.word) if election == "e": word = input( "Введите слово, значение которого вы хотите узнать: ") meaning = search_meaning_word(meaning) if meaning: print( f"Значение '{word}' - {meaning}") else: print(f"Слово '{word}' не найдено")
Code language: PHP (php)

Вы отображаете меню, считываете действия пользователя и действуете в соответствии с ними. Таким образом, пользователь может работать со словарем с помощью Python и Python ORM.

Полный код выглядит следующим образом:

from peewee import MySQLDatabase, Model, TextField DATABASE_NAME = "dictionary" USER = "root" PASSWORD = "" conexion = MySQLDatabase(DATABASE_NAME, user=USER, password=PASSWORD) class ModelBase(Model): class Meta: database = connection class Word(ModelBase): word = TextField() meaning = TextField() def create_tables(): connection.connect() connection.create_tables([Word]) def main(): create_tables() menu = """ a) Добавить новое слово b) Редактирование существующего слова c) Удалить существующее слово d) Смотрите список слов e) Значение слова f) Выход Select_words: """ election = "" while election != "f": election = input(menu) if election == "a": word = input("Введите слово: ") # Проверка наличия слова possible_meaning = search_meaning_word(word) if possible_meaning: print(f"Слово '{word}' уже существует") else: meaning = input("Введите значение: ") add_word(word, meaning) print("Слово добавлено") if election == "b": word = input("Введите слово, которое вы хотите отредактировать: ") new_meaning = input("Введите новое значение: ") edit_word(word, new_meaning) print("Слово обновлено") if election == "c": word = input("Введите слово для удаления: ") delete_word(word) if election == "d": words = get_words() print("=== Список слов ===") for word in words: # При чтении из базы данных данные возвращаются в виде массива, поэтому необходимо вывести первый элемент. print(word.word) if election == "e": word = input( "Введите слово, значение которого вы хотите узнать: ") meaning = search_meaning_word(meaning) if meaning: print( f"Значение '{word}' - {meaning}") else: print(f"Слово '{word}' не найдено") def add_word(word, meaning): Word.create(word=word, meaning=meaning) def edit_word(word, new_meaning): Word.update({Word.meaning: new_meaning}).where( Word.word == word).execute() def delete_word(word): Word.delete().where(Word.word == word).execute() def get_words(): return Word.select() def search_meaning_word(word): # peewee вызовет исключение, если не найдет совпадающих строк. try: return Word.select().where(Word.word == word).get().meaning except Exception: # Мы перехватываем это исключение, возвращая None, что означает, что такого слова не существует. return None if __name__ == '__main__': main()

Просто запустите код и воспользуйтесь меню.

Таким образом, мы можем сделать приложение, соединяющее Python с MySQL без написания запросов вручную, потому что все делается через Peewee ORM.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *