Zum Inhalt

Aktualisierung der Daten in der Datenbank

Die folgenden Methoden und Funktionen ermöglichen die Aktualisierung vorhandener Daten in der Datenbank .

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

  • update_or_create(**kwargs) -> Model

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

  • Das Modell

    • Die Methode . update ()
    • Die Model . upsert () - Methode
    • Model.saveDie lated () - Methode
    • Frage an den Vereinsvertreter

    • QuerysetProxy.update_or_create(**kwargs) Die Methode

aktualisiert

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

Mit der Aktualisierung der QuerySet-Ebene werden mehrere Datensätze mit demselben Wert gleichzeitig aktualisiert .

Sie müssen entweder zuerst QuerySet filtern oder das Flag each = True angeben , um die gesamte Tabelle zu aktualisieren .

Wenn Sie dieses Flag oder diesen Filter nicht angeben , wird ein QueryDefintionError ausgelöst .

Gibt die aktualisierte Zahl zurück .

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

!!!Vor der Aktualisierung der Warnung müssen Sie die Abfragesätze filtern , um ein versehentliches Überschreiben zu verhindern .

1
Zur Aktualisierung der gesamten Tabelle `each=True` muss als Sicherheits-Switch bereitgestellt werden .

Aktualisierung oder Schöpfung

update_or_create(**kwargs) -> Model

Aktualisieren Sie das Modell oder erstellen Sie ein neues Modell , wenn es keine Übereinstimmung in der Datenbank gibt .

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

Beachten Sie , dass Sie , wenn Sie ein neues Objekt erstellen möchten , entweder den pk-Spaltenwert übergeben oder die pk-Spalte auf eine automatische Inkrementierung setzen müssen .

Volumen aktualisiert

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

Erlaubt die Aktualisierung mehrerer Beispiele auf einmal .

Alle übergebenen Modelle müssen mit Primärschlüsselspalten gefüllt werden .

Sie können auch die zu aktualisierenden Felder auswählen , indem Sie die Liste der Spalten als Liste der Stringnamen übergeben .

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# Fortsetzen des Beispiels von Bulk _ create
Aktualisierte Objekte
für Todo in Todoes :
    todo. completed = False (falsch)

Perform update aller Objekte auf einmal
#objects need to have pk column set, andernfalls wird eine Ausnahme ausgelöst
await ToDo. objects. bulk_update (todoes)(Todo)(Dateiendung)

completed = await ToDo. objects. filter (completed = False). all ()(abgeschlossen = falsch)
abgeschlossen {adv}(abgeschlossen)= 3

Die Modellmethode

Jede Modellinstanz verfügt über eine Reihe von Methoden zum Speichern, Aktualisieren oder Laden von sich selbst.

Aktualisierung

Sie können Ihr Modell aktualisieren, indem Sie die Modelleigenschaften (Felder) aktualisieren und die update ()-Methode aufrufen.

Wenn Sie versuchen, ein Modell zu aktualisieren, ohne einen Primärschlüssel festzulegen, wird eine ModelPersistenceError-Ausnahme ausgelöst.

!!!tip Lesen Sie mehr über die update ()-Methode in models-update

Update einfügen

Es ist ein Proxy für die save () oder update (**kwargs) Methode des Modells, die die update ()-Methode aufruft, wenn pk gesetzt ist.

!!!tip Lesen Sie mehr über die upsert ()-Methode in models-uppsert

Bewahren Sie

Die Methode durchläuft alle Beziehungen des Modells, das die Methode aufruft, und ruft die upsert ()-Methode für jedes nicht gespeicherte Modell auf.

!!!tip Lesen Sie mehr über die save_lated ()-Methode in models-save-lated

Die QuerysetProxy Methode

Wenn Sie direkt auf das zugehörige Feld "ManyToMany" und "ReverseForeignKey" zugreifen, wird eine Liste der zugehörigen Modelle zurückgegeben.

Gleichzeitig wird jedoch eine Teilmenge der QuerySet-API verfügbar gemacht, sodass Sie relevante Modelle direkt aus dem übergeordneten Modell filtern, erstellen, auswählen usw. können.

Aktualisierung oder Schöpfung

Genau wie die oben genannte Funktion update_or_create, jedoch mit der Sie verwandte Objekte vom anderen Ende der Beziehung aktualisieren oder erstellen können.

!!!tip Um mehr über QuerysetProxy zu erfahren, besuchen Sie den Abschnitt querysetproxy