Aller au contenu

Insérer des données dans une base de données

La méthode suivante vous permet d'insérer des données dans une base de données.

  • Create (**kwargs) -> Modèle

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

  • update_or_create(**kwargs) -> Model

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

  • Modèle*Model.save () Méthode*Modèle.upsert() Méthode* Model.save_lated() Méthode

  • Query Set Agent* La méthode QuerysetProxy.create(**kwargs)* La méthode QuerysetProxy.get_or_create(_defaults: Optional[Dict[str, Any]] = None, **kwargs)* La méthode QuerysetProxy.update_or_create(**kwargs)

Création

Création (**kwargs): -> Modèle

Créez une instance de modèle, enregistrez-la dans la base de données et renvoyez le modèle mis à jour (remplissez pk si elle n'est pas transmise et que l'incrément automatique est défini).

Les kwargs autorisés sont les noms de champ de modèle et le type de valeur correct.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
Classe Album(modèle ormar):
    ormar_config = ormar.ormarConfig(
        database=database,
        Metadata=Metadata,
        tablename= album
    )


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


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

Une autre approche consiste à diviser la création et la persistance du modèle.

1
2
malibu = Album(nom ="Malibu")
await malibu.save ()

Tip

Obtenir ou créer

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

Créer et obtenir une combinaison de méthodes.

Essayez d'obtenir une ligne qui répond aux critères, et si une exception NoMatch est levée, une nouvelle ligne est créée avec les kwargs et_defaults donnés.

Lorsqu 'un dictionnaire_defaults est fourni, les valeurs définies dans_defaults seront toujours définies, y compris les valeurs fournies explicitement par override. IE get_or_create(_defaults: {"title": "I win"}, title="never used") utilisera toujours "J'ai gagné" comme titre, que vous fournissiez ou non votre propre valeur dans kwargs.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
Classe Album(modèle ormar):
    ormar_config = ormar.ormarConfig(
        database=database,
        Metadata=Metadata,
        tablename= album
    )

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


album, created = await Album.objects.get_or_create(nom ='The Cat', _defaults={"year": 1999})
Assert créé est vrai
assert album.name == "Le chat"
assert album.year == 1999
# object est créé comme il ne l'est pas
album 2, created = await Album.objects.get_or_create(nom ='The Cat')
Assert créé est faux
assert album == album 2
# return True as the same db row is returned

!!!Attention Bien qu 'il s'agisse d'une ligne équivalente dans la base de données, l'album et l'album 2 dans l'exemple ci-dessus sont 2 objets python différents! La mise à jour de l'un d'eux n'actualisera pas le second tant que vous n'aurez pas chargé explicitement () de nouvelles données de la base de données.

Notez que si vous souhaitez créer un nouvel objet, vous devez soit passer la valeur de la colonne pk, soit la colonne pk doit être réglée sur incrémentation automatique.

Mettre à jour ou créer

update_or_create(**kwargs) -> Model

Mettez à jour le modèle ou créez un nouveau modèle s'il n'y a pas de correspondance dans la base de données.

 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())

Notez que si vous souhaitez créer un nouvel objet, vous devez soit passer la valeur de la colonne pk, soit la colonne pk doit être réglée sur incrémentation automatique.

Créé par batch

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

Permet de créer plusieurs objets à la fois.

Une liste valide des objets modèles doit être transmise.

 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())

Approche modèle

Chaque instance de modèle dispose d'un ensemble de méthodes pour sauvegarder, mettre à jour ou se charger.

Sauver

Vous pouvez créer un nouveau modèle en utilisant la méthode QuerySet.create() ou en initialisant le modèle à un modèle pydantique normal et en appelant la méthode save().

!!!tip En savoir plus sur la méthode save() dans models-save

Mise à jour insérée

C'est un proxy pour la méthode save() ou update(**kwargs) du modèle. si pk n'est pas défini, la méthode save() est appelée.

!!!tip Lire plus sur la méthode upsert() dans models-upsert

Sauvegarder en relation

Une méthode parcourt toutes les relations du modèle qui l'a appelée et appelle la méthode upsert() sur chaque modèle non enregistré.

!!!tip En savoir plus sur la méthode save_lated() dans models-save-lated

La méthode QuerysetProxy

Lorsque vous accédez directement au champ ManyToMany associé, ainsi qu'à la clé ReverseForeignKey, une liste des modèles associés est renvoyée.

Mais en même temps, il expose un sous-ensemble de l'API QuerySet, de sorte que vous pouvez filtrer, créer, sélectionner des modèles pertinents, etc. directement à partir du modèle parent.

Créer des

Exactement comme la fonction de création ci-dessus, mais vous permet de créer des objets associés à partir de l'autre extrémité de la relation.

!!!conseil Pour en savoir plus sur Querysetproxy, visitez la section Querysetproxy

Obtenir ou créer

Exactement comme la fonction get_or_create ci-dessus, mais vous permet d'interroger ou de créer des objets associés de l'autre côté de la relation.

!!!conseil Pour en savoir plus sur Querysetproxy, visitez la section Querysetproxy

Mettre à jour ou créer

Exactement comme la fonction update_or_create ci-dessus, mais vous permet de mettre à jour ou de créer des objets associés de l'autre côté de la relation.

!!!conseil Pour en savoir plus sur Querysetproxy, visitez la section Querysetproxy