Ga naar inhoud

De gegevens in de database bijwerken

Met de volgende methoden en functies kunt u bestaande gegevens in de database bijwerken.

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

  • update_or_create(**kwargs) -> Model

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

  • model

    • Model.update () methode
    • Model.upsert () methode
    • Model.save\ _ lated () methode
    • Query instellen Agent

    • QuerysetProxy.update_or_create(**kwargs) werkwijze

bijwerken

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

Updates op QuerySet-niveau worden gebruikt om meerdere records met dezelfde waarde tegelijk bij te werken.

U moet eerst de QuerySet filteren of de vlag each = True opgeven om de hele tabel bij te werken.

Als u deze vlag of filter niet opgeeft, wordt QueryDefinitionError verhoogd.

Retourneert het bijgewerkte aantal rijen.

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

!!!Waarschuwing, de queryset moet worden gefilterd voordat deze wordt bijgewerkt om onbedoeld overschrijven te voorkomen.

1
Om de hele database tabel bijwerken `each=True` moet worden geleverd als een veiligheidsschakelaar

Bijwerken of aanmaken

update_or_create(**kwargs) -> Model

Werk het model bij of maak een nieuw model als er geen overeenkomst is in de database.

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

Merk op dat als u een nieuw object wilt maken, u de pk-kolomwaarde moet doorgeven of dat de pk-kolom moet worden ingesteld op automatisch verhogen

batch-update

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

Hiermee kunnen meerdere instanties tegelijkertijd worden bijgewerkt.

Alle goedgekeurde modellen moeten worden gevuld met primaire sleutelkolommen.

U kunt ook de velden selecteren die u wilt bijwerken door de kolomlijst door te geven als een lijst met snaarnamen.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# voortzetting van het voorbeeld van bulk _ create
# objecten bijwerken
Voor todo 's in todo 's:
    Todo.afgerond = Onwaar

# updates van alle objecten tegelijk uitvoeren
# objecten moeten pk-kolom hebben ingesteld, anders wordt de uitzondering verhoogd
wacht op ToDo.objects.bulk _ update (todoes)

Voltooid = wachten op ToDo.objects.filter (voltooid = onwaar) .all ()
Stel len (voltooid) = = 3

model werkwijze

Elk modelexemplaar heeft een set methoden om zichzelf op te slaan, bij te werken of te laden.

# # bijwerken

U kunt een model bijwerken door de eigenschappen (velden) bij te werken en de update () -methode aan te roepen.

Als u probeert het model bij te werken zonder de primaire sleutel in te stellen, wordt ModelPersistenceError uitzondering gegenereerd.

!!!Tip Lees meer over de update () methode in modellen-update

# # update invoegen

Het is een proxy voor de save () of update (**kwargs) -methoden van het model. Als pk is ingesteld, wordt de update () -methode aangeroepen.

!!!Tip Lees meer over de upsert () methode in modellen-upsert

# # opslaan gerelateerd

De methode herhaalt alle relaties van het model dat de methode heeft aangeroepen en roept de upsert () -methode aan op elk niet-opgeslagen model.

!!!Tip Lees meer over de methode opslaan\ _ lated () in modellen-opslaan-lated

QuerysetProxy methode

Wanneer u rechtstreeks toegang krijgt tot de relevante ManyToMany-velden en ReverseForeignKey, wordt een lijst met gerelateerde modellen geretourneerd.

Maar het toont ook een subset van de QuerySet API, zodat u rechtstreeks vanuit het bovenliggende model kunt filteren, maken, gerelateerde modellen kunt selecteren, enz.

Bijwerken of aanmaken

De update\ _ or\ _ create-functie is precies hetzelfde als hierboven, maar stelt u in staat om gerelateerde objecten vanaf het andere uiteinde van de relatie bij te werken of te maken.

Ga