Lewati ke isi

Perbarui data dalam database

Metode dan fungsi berikut memungkinkan Anda memperbarui data yang ada di database.

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

  • update_or_create(**kwargs) -> Model

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

  • model

    • Metode pemograman ()
    • Metode pemodelan ()
    • Model.save\ _ lated ()
    • Agen Setelan Kueri

    • QuerysetProxy.update_or_create(**kwargs) metode

pembaruan

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

Pembaruan level QuerySet digunakan untuk memperbarui beberapa rekaman dengan nilai yang sama sekaligus.

Anda harus memfilter QuerySet terlebih dahulu atau memberikan masing-masing = Bendera asli untuk memperbarui seluruh tabel.

Jika Anda tidak memberikan bendera atau filter ini, QueryDefinitionError dinaikkan.

Mengembalikan jumlah baris yang diperbarui.

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

!!!Peringatan, set kueri perlu disaring sebelum diperbarui untuk mencegah overwriting yang tidak disengaja.

1
Untuk memperbarui seluruh tabel database `each=True` perlu disediakan sebagai sakelar pengaman

Perbarui atau buat

update_or_create(**kwargs) -> Model

Perbarui model, atau buat model baru jika tidak ada kecocokan dalam 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())

Perhatikan bahwa jika Anda ingin membuat objek baru, Anda harus melewati nilai kolom pk, atau kolom pk harus disetel ke kenaikan otomatis

pembaruan batch

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

Memungkinkan beberapa instance untuk diperbarui secara bersamaan.

Semua model yang dilewati perlu diisi dengan kolom kunci utama.

Anda juga dapat memilih bidang yang akan diperbarui dengan melewati daftar kolom sebagai daftar nama string.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# melanjutkan contoh dari curah _ buat
# memperbarui objek
Untuk todos di todo:
    Todo.Complete = Salah

# lakukan pembaruan semua objek sekaligus
# objek harus memiliki set kolom pk, jika tidak, pengecualian dinaikkan
menunggu ToDo.objeks.bulk _ update (todid)

Selesai = tunggu ToDo.objeks.filter (selesai = Salah).all ()
Tutup len (selesai) = = 3

metode model

Setiap contoh model memiliki seperangkat metode untuk menyimpan, memperbarui, atau memuat dirinya sendiri.

# # pembaruan

Anda dapat memperbarui model dengan memperbarui properti (bidang) dan memanggil metode pembaruan ().

Jika Anda mencoba memperbarui model tanpa mengatur kunci utama, pengecualian ModelPersistenceError dilemparkan.

!!!Tip Baca lebih lanjut tentang metode pembaruan () dalam pembaruan model

# # pembaruan masukkan

Ini adalah proxy untuk metode penyimpanan () atau pembaruan model (**kwargs). Jika pk disetel, metode pembaruan () disebut.

!!!Tip Baca lebih lanjut tentang metode upsert () dalam model-upsert

# # terkait simpan

Metode ini mengulangi semua hubungan model yang disebut metode dan menyebut metode upsert () pada setiap model yang belum disimpan.

!!!Tip Baca lebih lanjut tentang metode save\ _ lated () dalam model-save-lated

Metode QuerysetProxy

Saat mengakses bidang ManyToMany dan ReverseForeignKey yang relevan secara langsung, daftar model terkait dikembalikan.

Tetapi juga memaparkan subset dari QuerySet API, sehingga Anda dapat memfilter, membuat, memilih model terkait, dll. langsung dari model induk.

Perbarui atau buat

Fungsi pembaruan\ _ atau\ _ buat persis sama dengan di atas, tetapi memungkinkan Anda memperbarui atau membuat objek terkait dari ujung hubungan yang lain.

!!!Untuk mempelajari lebih lanjut tentang QuerysetProxy, kunjungi bagian QuerysetProxy