Lewati ke isi

Masukkan data ke dalam database

Metode berikut memungkinkan Anda untuk memasukkan data ke dalam database.

  • Membuat (**Kwargs) - > Model

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

  • update_or_create(**kwargs) -> Model

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

  • Model*Model.save () metode*Model.upsert () metode\ * Model.save\ _ lated ()

  • Query Set Agent*metode QuerysetProxy.create(**kwargs)\ metode*QuerysetProxy.get_or_create(_defaults: Optional[Dict[str, Any]] = None, **kwargs)\ * metode QuerysetProxy.update_or_create(**kwargs)

membuat

Buat (**kwargs): - > Model

Buat contoh model, simpan di database, dan kembali untuk memperbarui model (pk diisi jika tidak lulus dan kenaikan otomatis diatur).

Kwarg yang diizinkan adalah nama bidang model dan jenis nilai yang benar.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
Album Kelas (ormar. Model):
    ormar _ config = ormar. OrmarConfig (
        Database = database,
        Metadata = metadata,
        Nama tabel = "album"
    )


    Id: int = ormar. Integer (primary _ key = Benar)
    Nama: str = ormar. String (max _ length = 100)


Malibu = await Album.objeks.create (name = "Malibu")
Tunggu Track.objects.create (album = malibu, judul = "The Bird," posisi = 1)

Pendekatan lain adalah penciptaan dan ketekunan model split.

1
2
Malibu = Album (nama = "Malibu")
Tunggu malibu.save

Tip

Memperoleh atau membuat

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

Buat dan dapatkan kombinasi metode.

Upaya untuk mendapatkan baris yang memenuhi kriteria, dan jika pengecualian NoMatch dilemparkan, baris baru dibuat dengan kwarg dan\ _ default yang diberikan.

Saat menyediakan kamus\ _ default, nilai yang ditetapkan dalam\ _ default akan selalu ditetapkan, termasuk mengesampingkan yang diberikan secara eksplisit. IE get_or_create(_defaults: {"title": "I win"}, title="never used") akan selalu menggunakan "Saya menang" sebagai judul apakah Anda memberikan nilai Anda sendiri dalam kwargs atau tidak.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
Album Kelas (ormar. Model):
    ormar _ config = ormar. OrmarConfig (
        Database = database,
        Metadata = metadata,
        Nama tabel = "album"
    )

    Id: int = ormar. Integer (primary _ key = Benar)
    Nama: str = ormar. String (max _ length = 100)
    Tahun: int = ormar. Integer ()


Album, dibuat = menunggu Album.objeks.get _ or _ create (nama = 'The Cat', _ defaults ={"year": 1999})
Penegasan yang dibuat adalah Benar
Tegaskan album.name = = "Kucing"
Ditegaskan album.year = = 1999
# objek dibuat karena tidak ada
Album2, dibuat = menunggu Album.objeks.get _ or _ create (nama = 'The Cat')
Menegaskan yang dibuat adalah Salah
Album pencuci mulut = = album2
# kembali Benar saat baris db yang sama dikembalikan

Peringatan!!!: Album dan album2 pada contoh di atas adalah 2 objek Python yang berbeda, meskipun baris yang setara dalam database! Memperbarui salah satunya tidak akan menyegarkan yang kedua sampai Anda secara eksplisit memuat () data baru dari database.

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

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

pembuatan batch

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

Memungkinkan Anda membuat beberapa objek secara bersamaan.

Anda harus melewati daftar objek model yang valid.

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

metode model

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

# # menyimpan

Anda dapat menggunakan metode QuerySet.make () atau menginisialisasi model sebagai model Pydantic normal dan kemudian memanggil metode save () untuk membuat model baru.

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

# # pembaruan masukkan

Ini adalah proxy untuk metode save () atau update model (**kwargs). Jika pk tidak disetel, metode save () akan 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.

membuat

Fungsi penciptaan identik dengan yang di atas, tetapi memungkinkan Anda untuk membuat objek terkait dari ujung hubungan yang lain.

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

Memperoleh atau membuat

Sama persis dengan fungsi get\ _ atau\ _ di atas, tetapi memungkinkan Anda untuk menanyakan atau membuat objek terkait dari ujung hubungan yang lain.

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

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