Перейти к содержанию

Вставка данных в базу данных

Следующие способы позволяют вставить данные в базу данных.

  • создание (**kwargs) -> Модель

  • get_or_create(_defaults: Optional[Dict[str, Any]] = None, **kwargs) -> Tuple[Model, bool]

  • update_or_create(**kwargs) -> Model

  • bulk_create(objects: List[Model]) -> None

Модель* *Model.save () метод*model.upsert ()* Model.save_lated () метод

Агент набора запросов* * Метод QuerysetProxy.create(**kwargs)* метод QuerysetProxy.get_or_create(_defaults: Optional[Dict[str, Any]] = None, **kwargs)* метод QuerysetProxy.update_or_create(**kwargs)

Создавая

Создание (**kwargs): -> модель

Создайте экземпляр модели, сохраните его в базе данных и возвратите обновленную модель (заполняется pk, если не передается и задано автоматическое приращение).

Допустимые kwargs-это имя поля модели и правильный тип значения.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
Class Album(Ormar):
    Органом-де-Органом-Органом-де-Органом-Органом (
        database= база данных,
        Метаданные = метаданные,
        tablename="album"
    )


    id: int = ormar.Integer(primary_key =True)
    name: str = ormar.String(max_length =100)


malibu = await Album.objects.create(name="Malibu")
await Track.objects.create(album=malibu, title="The Bird", position=1)

Другой способ заключается в создании и сохранении модели на основе разделения.

1
2
malibu = альбом (name="Malibu")
malibu.save (

Tip

Получить или создать

get_or_create(_defaults: Optional[Dict[str, Any]] = None, **kwargs) -> Tuple[Model, bool]

Создание и получение комбинации методов.

При попытке получить строку, удовлетворяющую критериям, при возникновении исключения NoMatch создается новая строка с использованием данных kwargs и_defaults.

При предоставлении словаря_defaults всегда устанавливаются значения, установленные в_defaults, включая переопределение явно предоставленных значений. IE get_or_create(_defaults: {"title": "I win"}, title="never used") всегда будет использовать «Я выиграл» в качестве заголовка независимо от того, указываете ли вы свои значения в kwargs или нет.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
Class Album(Ormar):
    Органом-де-Органом-Органом-де-Органом-Органом (
        database= база данных,
        Метаданные = метаданные,
        tablename="album"
    )

    id: int = ormar.Integer(primary_key =True)
    name: str = ormar.String(max_length =100)
    year: int = ormar.Integer()


album, created = await Album. objects.get_or_create (name ='The Cat',_defaults ={"year": 1999})
Assert Created is True
assert album.name ="The Cat"
album.year == 1999
# object is created as it does not exist
album2, created = await Album.objects.get_or_create (имя ='The Cat')
Assert created is False
album2 == album2
Return-True as the Same Db row Is Returned

!!!предупреждает, что, несмотря на то, что это эквивалентные строки в базе данных, album и album2 в приведенном выше примере представляют собой два разных объекта Python! Обновление одного из них не обновит второй, пока вы не будете явно загружены () новые данные из базы данных.

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

Обновить или создать

update_or_create(**kwargs) -> Model

Обновление модели или создание новой модели без соответствия в базе данных.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
import asyncio

import databases
import ormar
import sqlalchemy
from examples import create_drop_database

DATABASE_URL = "sqlite:///test.db"

ormar_base_config = ormar.OrmarConfig(
    database=databases.Database(DATABASE_URL),
    metadata=sqlalchemy.MetaData(),
)


class Book(ormar.Model):
    ormar_config = ormar_base_config.copy()

    id: int = ormar.Integer(primary_key=True)
    title: str = ormar.String(max_length=200)
    author: str = ormar.String(max_length=100)
    genre: str = ormar.String(
        max_length=100,
        default="Fiction",
    )


@create_drop_database(base_config=ormar_base_config)
async def run_query():
    await Book.objects.create(
        title="Tom Sawyer", author="Twain, Mark", genre="Adventure"
    )
    await Book.objects.create(
        title="War and Peace", author="Tolstoy, Leo", genre="Fiction"
    )
    await Book.objects.create(
        title="Anna Karenina", author="Tolstoy, Leo", genre="Fiction"
    )

    # if not exist the instance will be persisted in db
    vol2 = await Book.objects.update_or_create(
        title="Volume II", author="Anonymous", genre="Fiction"
    )
    assert await Book.objects.count() == 4

    # if pk or pkname passed in kwargs (like id here) the object will be updated
    assert await Book.objects.update_or_create(id=vol2.id, genre="Historic")
    assert await Book.objects.count() == 4


asyncio.run(run_query())

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

Пакетное создание

bulk_create(objects: List["Model"]) -> None

Позволяет создавать несколько объектов одновременно.

Необходимо передать допустимый список объектов модели.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import asyncio

import databases
import ormar
import sqlalchemy
from examples import create_drop_database

DATABASE_URL = "sqlite:///test.db"

ormar_base_config = ormar.OrmarConfig(
    database=databases.Database(DATABASE_URL),
    metadata=sqlalchemy.MetaData(),
)


class ToDo(ormar.Model):
    ormar_config = ormar_base_config.copy(tablename="todos")

    id: int = ormar.Integer(primary_key=True)
    text: str = ormar.String(max_length=500)
    completed = ormar.Boolean(default=False)


@create_drop_database(base_config=ormar_base_config)
async def run_query():
    # create multiple instances at once with bulk_create
    await ToDo.objects.bulk_create(
        [
            ToDo(text="Buy the groceries."),
            ToDo(text="Call Mum.", completed=True),
            ToDo(text="Send invoices.", completed=True),
        ]
    )

    todoes = await ToDo.objects.all()
    assert len(todoes) == 3


asyncio.run(run_query())

Метод модели

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

Экономия

Для создания новой модели можно использовать метод QuerySet.create() или инициализировать модель в виде обычной модели pydantic и вызвать метод save().

!!!tip Узнайте больше о методе save() в models-save

Обновить вставку

Он является прокси метода save() или update(**kwargs) модели. Если pk не установлен, вызывается метод save().

!!!tip Подробнее о методе upsert() в models-upsert

Сохранить связь

Метод проходит через все связи модели, к которой он был применен, и вызывает метод upsert() для каждой из несохраненных моделей.

!!!tip Подробнее о методе save_lated () в models-save-lated

Метод QuerysetProxy

При прямом доступе к соответствующему полю ManyToMany и ReverseForeignKey, возвращайтесь к списку связанных моделей.

Но в то же время он предоставляет подмножество API QuerySet, поэтому вы можете фильтровать, создавать и выбирать связанные модели непосредственно из родительской модели.

Создавая

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

Tip

Получить или создать

То же самое, что и функция get_or_create выше, но позволяет запрашивать или создавать зависимые объекты с другого конца отношения.

Tip

Обновить или создать

То же самое, что и функция update_or_create выше, но позволяет обновлять или создавать связанные объекты с другого конца отношения.

Tip