Zum Inhalt

Einfügen von Daten in eine Datenbank

Mit den folgenden Methoden können Sie Daten in die Datenbank einfügen .

  • -Erzeugung (**kwargs) - > Modell

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

  • update_or_create(**kwargs) -> Model

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

  • Das Modell * Model.save(c) Die Methode* Model . upsert () - Methode undModel.save\ _ lated () - Methoden

  • Frag den Gruppenleiter* QuerysetProxy.create(**kwargs) Methoden* QuerysetProxy.get_or_create(_defaults: Optional[Dict[str, Any]] = None, **kwargs) Methoden * QuerysetProxy.update_or_create(**kwargs) Die Methode

erschaffen .

Erstellen (**kwargs) : - > Modell

Erstellen Sie eine Modellinstanz , speichern Sie sie in der Datenbank und geben Sie das aktualisierte Modell zurück (füllen Sie pk aus , wenn es nicht übergeben wurde und ein automatisches Inkrement festgelegt wurde) .

Die zulässigen kwargs sind der Modellfeldname und der korrekte Werttyp .

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
Klasse Album (ormar . model) :
    Die Abbildung zeigt die Konfidenzintervalle (
        Datenbank = Datenbank ,
        Metathek = Metathek ,
        Tabername = " Das Album "
    )


    id : int = ormar . Integer (primary _ key = true) (nicht bekannt)
    name : str = ormar . String (max _ length = 100) [ Bearbeiten | Quelltext bearbeiten ]


Malibu = await Album . objects . create (name = " Malibu ") Bearbeiten
await Track . objects . create (Album = Malibu , title = " Der Vogel " , position = 1)

Eine andere Möglichkeit ist die Erstellung und Persistenz von Modellen in Teilen .

1
2
Malibu = Album (Vorname = " Malibu ")
Await istmalibu.save()

Tip

Erwerben oder schaffen

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

Eine Kombination von Methoden erstellen und erwerben .

Versuchen Sie , eine Zeile zu erhalten , die die Bedingung erfüllt , und wenn eine NoMatch-Ausnahme ausgelöst wird , wird eine neue Zeile mit den angegebenen kwargs und \ _ defaults erstellt .

Wenn das Wörterbuch \ _ defaults bereitgestellt wird , wird immer der Wert in \ _ defaults gesetzt , einschließlich des Überschreibens des explizit bereitgestellten Wertes IE get_or_create(_defaults: {"title": "I win"}, title="never used") Unabhängig davon , ob Sie Ihren eigenen Wert in kwargs angeben oder nicht , wird immer " Ich habe gewonnen " als Überschrift verwendet .

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
Klasse Album (ormar . Modell) :
    Die Abbildung zeigt die Konfidenzintervalle (
        Datenbank = Datenbank ,
        Metathek = Metathek ,
        Tabername = " Das Album "
    )

    id : int = ormar . Integer (primary _ key = true) (nicht bekannt)
    name : str = ormar . String (max _ length = 100)
    Jahr : int = Ormar . Integer ()


GET _ OR _ CREATE (name ='The Cat', _ defaults ={"year": 1999}) ist ein
Assert Created ist echt
Assert hinzufügenalbum.name> > Die Katze
assert album . year = 1999 (Jahr)
Objekt wird erschaffen , weil es nicht existiert
Album2 , created = await Album . objects . get _ or _ create (name = The Cat') [ Bearbeiten | Quelltext bearbeiten ]
assert created ist false
Das neue Album = Album 2
# TRUE as the same DB-ROW is returned

!!!Warnung Obwohl es sich um eine äquivalente Zeile in der Datenbank handelt, sind album und album2 im obigen Beispiel 2 verschiedene Python-Objekte!

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 .

Aktualisieren oder Erstellen

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 .

Masse erschaffen .

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

Ermöglicht es Ihnen , mehrere Objekte auf einmal zu erstellen .

Eine gültige Liste von Modellobjekten muss übergeben werden.

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

Die Modell-Methode

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

sparen

Sie können ein neues Modell erstellen, indem Sie die QuerySet. create ()-Methode verwenden oder das Modell als normales pydantisches Modell initialisieren und dann die save ()-Methode aufrufen.

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

Update einfügen

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

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

Bewahren Sie

Eine 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.

erschaffen.

Genau die gleiche Erstellungsfunktion wie oben, aber Sie können verwandte Objekte vom anderen Ende der Beziehung aus erstellen.

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

Erwerben oder schaffen

Genau wie die oben genannte Funktion get_or_create, aber mit der Sie vom anderen Ende der Beziehung aus ein zugehöriges Objekt abfragen oder erstellen können.

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

Aktualisieren oder Erstellen

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