Aller au contenu

Mettre à jour les données dans la base de données

Les méthodes et fonctions suivantes permettent de mettre à jour les données existantes dans une base de données.

  • update(each: bool = False, **kwargs) -> int

  • update_or_create(**kwargs) -> Model

  • bulk_update(objects: List[Model], columns: List[str] = None) -> None

  • Modèle de

    • Modèle.update() méthode
    • Modèle.upsert() Méthode
    • Model.save_lated() Méthode
    • Query Set Agent pour

    • QuerysetProxy.update_or_create(**kwargs) Méthodes

Actualités

update(each: bool = False, **kwargs) -> int

Les mises à jour de niveau QuerySet sont utilisées pour mettre à jour plusieurs enregistrements avec la même valeur à la fois.

Vous devez soit filtrer le QuerySet en premier, soit fournir l'attribut each=True pour mettre à jour l'ensemble de la table.

Si vous ne fournissez pas ce drapeau ou ce filtre, une QueryDefinitionError est levée.

Renvoie le nombre de lignes mises à jour.

 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
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(
        tablename="books",
    )

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

    await Book.objects.update(each=True, genre="Fiction")
    all_books = await Book.objects.filter(genre="Fiction").all()
    assert len(all_books) == 3


asyncio.run(run_query())

!!!Les mises à jour d'avertissement doivent être précédées d'un filtrage des ensembles de requêtes pour éviter les écrasements accidentels.

1
Mettre à jour la table de base complète `each=True` Besoin d'être fourni comme un commutateur de sécurité

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.

Mise à jour en masse

bulk_update(objects: List["Model"], columns: List[str] = None) -> None

Permet la mise à jour de plusieurs instances à la fois.

Tous les modèles passés doivent remplir la colonne de clé primaire.

Vous pouvez également sélectionner les champs à mettre à jour en passant la liste des colonnes comme une liste de noms de chaînes.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
#continuer l'exemple de bulk_create
# update objets
Pour todo in todoes:
    todo. complété = faux

# perform update de tous les objets en une seule fois
#objets doivent avoir pk colonne set, autre exception est raisonnée
await ToDo.objects.bulk_update(todoes)

completed = await ToDo.objects.filter(completed=False).all()
assert len(complet) == 3

Approche modèle

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

Actualité

Vous pouvez mettre à jour un modèle en mettant à jour les propriétés du modèle (champs) et en appelant la méthode update().

Si vous essayez de mettre à jour un modèle sans définir de clé primaire, une exception ModelPersistenceError est levée.

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

Mise à jour insérée

C'est un proxy pour les méthodes save() ou update(**kwargs) du modèle. si pk est défini, la méthode update() 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.

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