Рубрики
Без рубрики

Masonite Orm (Oritor)

Простое введение в масонитовый ORM под названием Oritor. Теги с Python, Masonite, учебником, рамками.

Почти каждая структура приходит с приходом ORM. ORM является объектом Relational Mapper и является просто $ 10 для определения 1 доллара. В сложных условиях ORM – это просто способ взаимодействовать с базой данных в «объекте». В случае Python, связанный с «объектом» – использовать классы.

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

Мы называем эти классы «Модели».

Казонит Использует ORM ORM как ORM выбора. Этот ORM может отличаться от ORM в прошлом. Если вы исходите с любых других Python Framework, чем это будет немного новым опытом обучения для вас. Если вы приедете из рамок, таких как Laravel или Ruby на рельсах, этот ORM сделает много смысла прямо с летучей мыши.

Перед прочтением

Перед тем, как начать чтение, обратите внимание, что мы будем здесь подробно описаны, как ORM можно использовать с Masonite Framework и не будет в деталях, на которой работают миграции базы данных. Это нужно будет иметь свою собственную статью, и вы можете прочитать больше об этом в Masonite’s Миграция базы данных Страница документации.

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

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

Конфигурация действительно проста с касонитом. Все файлы конфигурации базы данных можно найти в вашем .env файл. В этом файле вы найдете то, что выглядит так:

DB_DRIVER=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=masonite
DB_USERNAME=root
DB_PASSWORD=root

Продолжайте и настройте любые необходимые вам настроек конфигурации.

Настройки конфигурации внутри .env Файл достаточно хорош для MySQL, так и для Postgres, но вам также понадобятся драйверы для поддержки подключения к базе данных.

Если вы используете MySQL, у вас есть 2 варианта:

$ pip install PyMySQL

или

$ pip install mysqlclient

Если вы используете Postgres, то у вас есть только 1 вариант:

$ pip install psycopg2

Если вы используете SQLite, у вас есть немного больше. Вам не нужны драйверы, но вам нужно удалить некоторые настройки из config/database.py файл.

Откройте этот файл и должен быть раздел, который выглядит как:

DATABASES = {
    'default': {
        'driver': os.environ.get('DB_DRIVER'),
        'host': os.environ.get('DB_HOST'),
        'database': os.environ.get('DB_DATABASE'),
        'user': os.environ.get('DB_USERNAME'),
        'password': os.environ.get('DB_PASSWORD'),
        'prefix': ''
    }
}

Для SQLite нам нужно удалить хозяин , Пользователь и пароль Варианты здесь и сделайте это:

DATABASES = {
    'default': {
        'driver': os.environ.get('DB_DRIVER'),
        'database': os.environ.get('DB_DATABASE'),
        'prefix': ''
    }
}

Это связано с тем, что SQLite не нуждается в этих вариантах и будет выбросить исключение, если найдено.

Хорошо, отлично, так что если вы сделали это далеко, вы знаете, как сделать миграцию, читая документацию по миграциям, вы знаете, как настроить MySQL или Postgres. Теперь нам просто нужно знать, как получить доступ к вашим данным в нашей базе данных.

Получение данных

Есть несколько разных способов получить данные из таблицы. Для целей этой статьи мы будем использовать Пользователь Модель, чтобы обобщить все.

Получать по ключу

Мы можем получить определенную строку по его основным ключам, используя Найти () Метод, который требует идентификатора:

def show(self):
    User.find(1)

Это вернет запись с основным ключом 1 Отказ

Получение всех записей

Theres будет много раз, когда вы хотите получить все записи стола. Вы можете сделать это, как это:

def show(self):
    User.all()

Это вернет коллекцию всех результатов таблицы.

Получать по значению

Мы также можем получить по значению определенного столбца. При использовании RAW SQL это будет аналогично Где ключевое слово. Может быть, не так совпадают, метод называется где :

def show(self):
    User.where('email', 'user@email.com').get()

Это вернет сбор результатов, даже если это один результат. Больше, чем раз в день, когда я обычно забываю, чтобы добавить этот маленький Получить () Метод в конце, поэтому убедитесь, что вы добавите этот метод, чтобы вы на самом деле привлечь результат.

Получение первой записи

Мы также можем получить первую запись в результате, что вернет фактическую модель вместо коллекции:

def show(self):
    User.where('email', 'user@email.com').first()

Это вернет первый результат из коллекции.

Совокупность Где

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

def show(self):
    User.where('id', '<' '2').get()

Выщипывание ценностей

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

def show(self):
    User.where('id', '<' '2').get().pluck('email')

Это вернет новую коллекцию только с электронными письмами этих пользователей.

В которой

Вы можете использовать этот метод для получения значений, где в списке других значений. Например, мы можем получить все записи, которые писем, которые есть в списке, которые мы предоставляем:

def show(self):
    User.where_in('id', [1, 2]).get()

Это вернет все ряды, где ID это 1 или 2 Отказ

Это особенно полезно при использовании щипать метод сверху. Мы можем сорвать все ID колонны из другой модели.

Мы могли бы позвонить всем сообщениям, которые имеют авторы, которые активны, например:

def show(self):
    Post.where_in(
        'id',
        User.where('active', '1').get().pluck('id')
    )

Этот код просто получает все пользователи, которые активны и разрывают свой идентификатор, который возвращает коллекцию идентификатора, которые мы можем затем использовать для передачи в где_in Способ возвращения нового результата только с постами пользователей, которые активны.

Где нет В

Мы можем сделать то же самое, что и выше, но у меня есть код, которые показывают, что пользователи не активны, используя другой где_not_in Метод:

def show(self):
    Post.where_not_in(
        'id',
        User.where('active', '1').get().pluck('id')
    )

Это просто использует где_not_in Метод вместо где_in метод.

После того, как мы получим информацию, которую мы имеем, это может быть полезно, если мы можем обновить этот идентификатор. Есть несколько способов сделать то, что мы войдем в этот раздел.

Метод обновления

Мы можем использовать метод обновления для обновления строки, которую мы выбирали:

def show(self):
    User.find(1).update(email='new@email.com')

или мы можем пройти в словаре:

def show(self):
    User.find(1).update({'user-email': 'new@email.com'})

Обратите внимание, что когда мы пройдем в словаре, мы можем использовать имена столбцов, которые могут не быть действительными аргументами ключевых слов Python. Это действительно единственная разница между ними.

Мы также можем обновить свойства на модели и позвонить в Сохранить () Метод:

def show(self):
    user = User.find(1)
    user.email = 'new@email.com'

    user.save()

Обновление нескольких записей

Вы можете обновить несколько записей одновременно, как обновление всех пользователей в активное состояние после определенного действия:

def show(self):
    User.where('id', '>', 10).update(active=0)

Это запускает обновление на всех найденных записях.

Обновление временных меток

Иногда вам нужно только обновить журналы записи. Например, вы можете получить пользователя, но и обновить modified_at Timestamp:

def show(self):
    user = User.find(1)
    user.touch()

Создание новых записей также действительно просто. Простое создание новых экземпляров модели мы можем создавать новые записи.

Создание новых записей со свойствами

def show(self):
    user = User()
    user.name = 'Joe'
    user.email = 'name@email.com'
    user.save()

Это создаст новую запись.

Создание новых записей с методом создания

Мы можем использовать Создать Метод:

def show(self):
    user = User.create(name='Joe', email='name@email.com')

Удаление

Мы также можем удалить записи:

def show(self):
    User.find(1).delete()
    User.where('id', '>', 10).delete()
    User.destroy(1, 2, 3)

Отношения чрезвычайно просты с оратором. В других рамках Python вы можете указать отношения внешнего ключа в классе свойства или атрибут класса. С оратором вы делаете что-то подобное, но немного по-другому.

Имеет один

Допустим, у нас есть внешний ключ, который соответствует 1 пользователю на 1 стол.

Мы можем связать эти отношения внутри нашей модели, как это:

from orator.orm import has_one
from app.Desk import Desk

class User(Model):

    @has_one
    def desk(self):
        return Desk

Оратор пытается угадать, каковы иностранные ключ, и он основан на этой логике:

# other_table_key, local_key 
@has_one('other_id', 'table_id')

и отображает идентификатор к именам таблиц. Например, это технически бывает значения по умолчанию и будет точно так же, как код модели выше:

from orator.orm import has_one
from app.Desk import Desk

class User(Model):

    @has_one('desk_id', 'user_id')
    def desk(self):
        return Desk

Этот код будет действовать так же, как код выше. Вы, вероятно, придется изменить это, хотя к чему-то вроде:

from orator.orm import has_one
from app.Desk import Desk

class User(Model):

    @has_one('id', 'user_desk')
    def desk(self):
        return Desk

Это будет отображать локальный столбец user_desk к иностранной колонке ID в Рабочий стол стол.

Динамические свойства

Мы можем использовать эти отношения с использованием «динамических свойств». Это просто означает, что логически, вы можете подумать, что вы должны использовать стол () метод как метод Но вместо этого вы назовете это как недвижимость:

def show(self):
    User.find(1).desk.computer

Уведомление здесь, что стойку не вызывается, просто доступ к недвижимости.

Принадлежит

А принадлежит к отношениям определяет обратное has_one отношение. Потому что это обратное отношение, нам просто нужно перевернуть иностранные ключи

from orator.orm import belongs_to
from app.Desk import Desk

class User(Model):

    @belongs_to('user_desk', 'id')
    def desk(self):
        return Desk

Так что теперь карта будет:

# local_key, other_table_key
@belongs_to('table_id', 'other_id')

Имеет много

Вы также можете указать много взаимоотношений так же. У любого данного пользователя может быть много задач.

from orator.orm import has_many
from app.Task import Task

class User(Model):

    @has_many('user_desk', 'id')
    def desk(self):
        return Task

Так что теперь карта будет:

# other_table_key, local_key
@has_many('other_id', 'table_id')

Вы можете узнать больше о модельных отношениях, если вам нужны более продвинутые отношения или более разъяснение в Орученная документация страница.

Крунтовые зависимости не являются хорошими в Python, потому что он делает 2 класса полагаться на друг друга, и импортируя 1 класс, возможно, не сможет импортировать другой класс вовремя, и он бросит исключение не в состоянии найти класс, который требует.

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

from orator.orm import has_many

class User(Model):

    @has_many('user_desk', 'id')
    def desk(self):
        from app.Task import Task
        return Task

Это облегчает любые возможности иметь общие вопросы импорта.

Оригинал: “https://dev.to/masonite/masonite-orm-orator-3bh0”