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.