Tata bahasa
[! Versi Pypi ] (https://pypi.org/project/ormar)
! [Cakupan] ] (https://codecov.io/gh/collerek/ormar)! [CodeFactor] ] (https://www.codefactor.io/repository/github/collerek/ormar)

gambaran umum
Paket Ormar adalah ORM asinkron untuk Python yang mendukung Postgres, MySQL, dan SQLite.
Manfaat utama menggunakan ormar adalah:
- Dapatkan ORM asinkron yang dapat digunakan dengan kerangka asinkron (fastapi, starlette, dll.)
- hanya perlu mempertahankan satu model - Anda tidak perlu mempertahankan pydantic dan model orm lainnya (sqlalchemy, peewee, gino, dll.)
Tujuannya adalah untuk membuat ORM sederhana yang dapat digunakan langsung dengan FastAPI berbasis Pydantic untuk validasi data (sebagai model permintaan dan respons).
Ormar - selain dari "ORM" yang jelas dalam namanya - mendapatkan namanya dari ormar Swedia, yang berarti ular, dan ormar Kroasia (e), yang berarti kabinet.
Untuk Python ORM, nama apa yang lebih baik dari Kabinet Ular?
Jika Anda menyukai ormar, ingatlah untuk membintangi repositori di GitHub!
Semakin besar komunitas yang kami bangun, semakin mudah untuk menemukan bug dan menarik kontributor.
Dokumen
Periksa dokumentasi untuk detailnya.
Harap dicatat bahwa demi singkatnya, sebagian besar fragmen dokumentasi menghilangkan pembuatan database dan pelaksanaan fungsi berjalan asinkron terjadwal.
Jika Anda menginginkan lebih banyak contoh kehidupan nyata daripada dalam dokumentasi, Anda dapat melihat folder tes karena sebenarnya harus dibuat dan dihubungkan ke database di sebagian besar pengujian.
Namun perlu diingat bahwa ini hanyalah tes, dan tidak semua solusi cocok untuk penggunaan di kehidupan nyata.
Bagian dari ekosistem FastAPI
Sebagai bagian dari ekosistem FastAPI, Ormar didukung di perpustakaan terpilih yang bekerja dengan database dalam beberapa cara.
Ormar masih merupakan dialek SQL agnostik - jadi hanya kolom yang bekerja di semua backends yang didukung yang diimplementasikan.
Sebagai perpanjangan dari ormar, relatif mudah untuk mengimplementasikan kolom untuk dialek tertentu.
Postgres kolom-spesifik implementasi: ormar-postgres-extensions
Jika Anda memelihara atau menggunakan perpustakaan yang berbeda dan ingin mendukung ormar, beri tahu kami bagaimana kami dapat membantu.
ketergantungan
Pembangunan Ormar adalah:
- Inti SQL Alchemy untuk membuat kueri.
- Database untuk dukungan asinkron lintas database.
- Pydantic digunakan untuk validasi data.
lisensi
Ormar dibangun sebagai perangkat lunak sumber terbuka dan akan tetap bebas sepenuhnya (di bawah lisensi MIT).
Ketika saya menulis kode sumber terbuka untuk memecahkan masalah sehari-hari di tempat kerja atau untuk mempromosikan dan membangun komunitas Python yang kuat, Anda dapat mengucapkan terima kasih dan membelikan saya secangkir kopi atau hibah bulanan untuk membantu memastikan bahwa pekerjaan saya tetap bebas dan terpelihara.
sponsor
Migrasi dari sqlalchemy dan database yang ada
Jika saat ini Anda menggunakan sqlalchemy dan ingin beralih ke ormar, lihat alat terjemahan otomatis, yang dapat membantu Anda menerjemahkan model orm sqlalchemy yang ada sehingga Anda tidak perlu melakukannya secara manual.
Versi beta dapat ditemukan di github: sqlalchemistry-to-ormar atau hanya pip install sqlalchemy-to-ormar
Sqlalchemy-to-ormar dapat digunakan dengan sqlacodegen untuk memetakan / menghasilkan model ormar secara otomatis dari database yang ada, bahkan jika proyek Anda tidak menggunakan sqlalchemy.
Migrasi dan pembuatan database
Karena ormar dibangun di atas inti SQL Alchemy, Anda dapat menggunakan alembic untuk menyediakan migrasi database (yang benar-benar harus Anda lakukan untuk kode produksi).
Untuk pengujian dan aplikasi dasar, sqlalchemy sudah cukup.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 | # perhatikan ini hanya cuplikan parsial contoh kerja lengkap di bawah ini
# 1. Impor
meter persegi import
Basis data impor
Asrama impor
# 2. Inisialisasi
DATABASE _ URL = "sqlite: / / db.sqlite"
base _ ormar _ config = ormar. OrmarConfig (
Metadata = sqlalchemy. MetaData (),
Database = database. Database (DATABASE _ URL),
Mesin = sqlalchemy.create _ engine (DATABASE _ URL),
)
Tentukan model di sini
# 3. Pembuatan database dan pembuatan tabel
base _ ormar _ konfigurasi metadata buat _ semua (mesin)
|
Untuk konfigurasi sampel alembik dan informasi lebih lanjut tentang migrasi dan pembuatan database, kunjungi bagian dokumentasi migrasi.
versi kemasan
Ormar masih dalam pengembangan: kami sarankan untuk memperbaiki ketergantungan apa pun (yaitu ormar ~ = 0.9.1)
Ormar juga mengikuti penomoran rilis, yaitu perubahan besar meningkatkan nomor versi utama, sementara perubahan dan perbaikan lainnya meningkatkan nomor versi kecil, jadi untuk yang terakhir Anda harus aman untuk memperbarui, tetapi pastikan untuk membaca dokumentasi rilis terlebih dahulu.example: (0.5.2 -> 0.6.0 - breaking, 0.5.2 -> 0.5.3 - non breaking).
Piton Asinkron
Harap dicatat bahwa ormar adalah ORM asinkron, yang berarti Anda harus menunggu panggilan ke metode yang dijadwalkan untuk dieksekusi dalam loop acara. Python memiliki modul built-in, asyncio, yang memungkinkan Anda melakukan ini.
Harap dicatat bahwa sebagian besar penerjemah Python "normal" tidak mengizinkan menunggu untuk dieksekusi di luar fungsi (karena Anda sebenarnya menjadwalkan fungsi ini untuk menunda eksekusi dan tidak mendapatkan hasil langsung).
Dalam kerangka kerja web modern seperti FastAPI, kerangka kerja akan menangani ini untuk Anda, tetapi jika Anda berencana untuk melakukannya sendiri, Anda harus melakukannya secara manual, seperti yang dijelaskan dalam start cepat di bawah ini.
Mulai Cepat
Harap dicatat bahwa Anda dapat menemukan skrip yang sama di folder contoh di GitHub.
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408 | Impor opsional dari pengetikan
Basis data impor
Asrama impor
meter persegi import
DATABASE _ URL = "sqlite: / / db.sqlite"
base _ ormar _ config = ormar. OrmarConfig (
Metadata = sqlalchemy. MetaData (),
Database = database. Database (DATABASE _ URL),
Mesin = sqlalchemy.create _ engine (DATABASE _ URL),
)
# perhatikan bahwa langkah ini opsional - > semua perhatian ormar adalah bidang dengan nama
# ormar _ config # dan parameter yang tepat, tetapi dengan cara ini Anda tidak perlu mengulang
# parameter yang sama jika Anda hanya menggunakan satu database
#
# Perhatikan bahwa semua jenis petunjuk adalah opsional
# di bawah ini adalah deklarasi model yang sangat valid
# class Author (ormar. Model):
# ormar _ config = base _ ormar _ config (tablename = "penulis")
#
# id = ormar. Integer (primary _ key = True) # < = no tice no tipe field
# name = ormar. String (max _ length = 100)
Kelas Penulis (ormar. Model):
ormar _ config = base _ ormar _ config (tablename = "penulis")
Id: int = ormar. Integer (primary _ key = Benar)
Nama: str = ormar. String (max _ length = 100)
Buku Kelas (ormar. Model):
ormar _ config = base _ ormar _ config (tablename = "buku")
Id: int = ormar. Integer (primary _ key = Benar)
Author: Opsional [Author] = ormar. ForeignKey (Author)
Judul: str = ormar. String (max _ length = 100)
Tahun: int = ormar. Integer (nullable = Benar)
# membuat database
# perhatikan bahwa dalam produksi Anda harus menggunakan migrasi
# perhatikan bahwa ini tidak diperlukan jika Anda terhubung ke database yang ada
# hanya untuk memastikan kami membersihkan db sebelumnya
base _ ormar _ konfigurasi metadata drop _ semua (mesin)
base _ ormar _ konfigurasi metadata buat _ semua (mesin)
# semua fungsi di bawah ini dibagi menjadi kategori fungsionalitas
# perhatikan bagaimana semua fungsi didefinisikan dengan async - maka dapat digunakan menunggu DAN perlu
# ditunggu sendiri
Aync pasti membuat ():
# Buat beberapa catatan untuk dikerjakan melalui metode QuerySet.buat.
# Perhatikan bahwa queryset diekspos pada setiap kelas Model sebagai objek
Tolkien = menunggu Author.objeks.create (nama = "J.R.R. Tolkien")
Menunggu Book.objeks.create (penulis = tolkien, judul = "The Hobbit," tahun = 1937)
Menunggu Book.objeks.create (penulis = tolkien, judul = "The Lord of the Rings," tahun = 1955)
Menunggu Book.objeks.create (penulis = tolkien, judul = "The Silmarillion," tahun = 1977)
# penciptaan alternatif objek dibagi menjadi 2 langkah
Sapkowski = Penulis (nama = "Andrzej Sapkowski")
# melakukan beberapa hal
Tunggu sapkowski.save
# atau simpan () setelah inisialisasi
Menunggu Buku (penulis = sapkowski, judul = "The Witcher," tahun = 1990). simpan ()
Buku Menunggu (penulis = sapkowski, judul = "Menara Orang Bodoh," tahun = 2002). simpan ()
# untuk membaca lebih lanjut tentang memasukkan data ke dalam database
# kunjungi: https://collerek.github.io/ormar/queries/create/
Aync pasti baca ():
# Ambil contoh, tanpa memuat hubungan kunci asing di dalamnya.
# Gaya Django
Buku = menunggu Book.objeks.get (judul = "The Hobbit")
# atau gaya python
Buku = menunggu Book.objeks.get (Book.title = = "The Hobbit")
Book2 = menunggu Book.objeks.first ()
# pertama () mengambil instance dengan nilai kunci primer yang lebih rendah
Buku pencuci mulut = = buku 2
# Anda dapat mengakses semua bidang pada model yang dimuat
Tegaskan buk.title = = "The Hobbit"
Assert book.year = = 1937
# ketika tidak ada kondisi yang dilewati untuk mendapatkan ()
# berperilaku sebagai yang terakhir () berdasarkan kolom kunci utama
Book3 = menunggu Book.objeks.get ()
Menegaskan book3.title = = "Menara Orang Bodoh"
# Ketika Anda memiliki hubungan, ormar selalu mendefinisikan model terkait untuk Anda
# bahkan ketika semua yang Anda muat adalah nilai kunci asing seperti dalam contoh ini
Menegaskan isinstance (book.author, penulis)
# kunci utama dihuni dari kunci asing yang disimpan dalam tabel buku
Tegaskan book.author.pk = = 1
# karena model terkait tidak dimuat semua bidang lainnya Tidak ada
Tegaskan book.author.name Tidak Ada
# Muat hubungan dari database ketika Anda sudah memiliki model terkait
# alternatif lihat bagian bergabung di bawah ini
Tunggu book.author
Menegaskan book.author.name = = "J.R.R. Tolkien"
# dapatkan semua baris untuk model yang diberikan
Penulis = tunggu Author.objeks.all ()
Tegaskan len (penulis) = = 2
# untuk membaca lebih lanjut tentang membaca data dari database
# kunjungi: https://collerek.github.io/ormar/queries/read/
Pembaruan pasti Aync ():
# baca baris yang ada dari db
Tolkien = menunggu Author.objeks.get (nama = "J.R.R. Tolkien")
Menegaskan tolkien.name = = "J.R.R. Tolkien"
Tolkien _ id = tolkien.id
# ubah properti yang dipilih
tolkien.name = "John Ronald Reuel Tolkien"
# call update pada contoh model
Menunggu pembaruan tolkien. ()
# konfirmasi bahwa objek telah diperbarui
Tolkien = menunggu Author.objeks.get (nama = "John Ronald Reuel Tolkien")
Assert tolkien.name = = "John Ronald Reuel Tolkien"
Tegaskan tolkien.id = = tolkien _ id
# alternatif memperbarui data tanpa memuat
Tunggu Author.objeks.filter (nama _ _ mengandung = "Tolkien").update (nama = "J.R.R. Tolkien")
# untuk membaca lebih lanjut tentang memperbarui data di database
# kunjungi: https://collerek.github.io/ormar/queries/update/
Aync pasti dihapus ():
Silmarillion = menunggu Book.objeks.get (tahun = 1977)
# panggil hapus () misalnya
Menunggu silmarillion dihapus ()
# alternatif menghapus tanpa memuat
Menunggu Book.objeks.delete (judul = "Menara Orang Bodoh")
# perhatikan bahwa ketika tidak ada rekaman ormar menaikkan Tidak ada pengecualian
Coba:
Menunggu Book.obtss.get (tahun = 1977)
Kecuali ormar. Tidak cocok:
Cetak ("Tidak ada buku dari tahun 1977!")
# untuk membaca lebih lanjut tentang menghapus data dari database
# kunjungi: https://collerek.github.io/ormar/queries/delete/
# perhatikan bahwa terlepas dari kenyataan bahwa rekaman tidak lagi ada di database
# Objek di atas masih dapat diakses dan Anda dapat menggunakannya (dan i.e.save ()) lagi.
Tolkien = silmarillion.author
Menunggu Book.objeks.create (penulis = tolkien, judul = "The Silmarillion," tahun = 1977)
Async def bergabung:
# Tho bergabung dengan dua model gunakan pilih _ terkait
# Gaya Django
Buku = menunggu Book.objeks.select _ related ("penulis").get (judul = "The Hobbit")
# Gaya ular piton
Buku = menunggu Book.objeks.Select _ terkait (Book.author).get (
Book.title = = "Sang Hobbit"
)
# sekarang author udah di prefetched
Menegaskan book.author.name = = "J.R.R. Tolkien"
# Secara default Anda juga mendapatkan sisi kedua dari hubungan
# dibangun sebagai nama model sumber huruf kecil + 's ' (buku dalam hal ini)
# Anda juga dapat memberikan nama khusus dengan nama _ terkait parameter
# Gaya Django
Penulis = await Author.objeks.select _ related ("buku").all (nama = "J.R.R. Tolkien")
# Gaya ular piton
Penulis = await Author.objeks.select _ terkait (Author.books).all (
Author.name = = "J.R.R. Tolkien"
)
Assert len (penulis [0] .books) = = 3
# untuk kebalikan dan banyak untuk banyak hubungan Anda juga dapat memilih _ terkait
# yang menjalankan pertanyaan terpisah untuk setiap model terkait
# Gaya Django
Penulis = await Author.objeks.prefetch _ terkait ("buku").get (nama = "J.R.R. Tolkien")
# Gaya ular piton
Penulis = await Author.objeks.prefetch _ terkait (Author.books).get (
Author.name = = "J.R.R. Tolkien"
)
Assert len (author.books) = = 3
# untuk membaca lebih lanjut tentang hubungan
# kunjungi: https://collerek.github.io/ormar/relations/
# untuk membaca lebih lanjut tentang bergabung dan subkueri
# kunjungi: https://collerek.github.io/ormar/queries/joins-and-subqueries/
Sinkronisasi filter def _ and _ sort ():
# untuk memfilter kueri, Anda dapat menggunakan filter () atau meneruskan pars nilai kunci ke
# dapatkan (), semua () dll.
# menggunakan metode khusus atau mengakses bidang model terkait menggunakan ganda
# underscore like untuk filter dengan nama author yang digunakan author _ _ name
# Gaya Django
Buku = menunggu Book.objeks.all (author _ _ name = "J.R.R. Tolkien")
# gaya python
Buku = waiting Book.obts.all (Book.author.name = = "J.R.R. Tolkien")
Assert len (buku) = = 3
# filter dapat menerima metode khusus juga dipisahkan dengan garis bawah ganda
# untuk mengeluarkan ` where authors.name like "%tolkien%"` kueri sql yang tidak
# case sensitive (karenanya t kecil di Tolkien)
# Gaya Django
Buku = menunggu Book.objeks.filter (author _ _ name _ _ icontains = "tolkien").all ()
# gaya python
Buku = menunggu Book.objeks.filter (Book.author.name ikontains ("tolkien").all ()
Assert len (buku) = = 3
# untuk mengurutkan penggunaan order _ by () fungsi queryset
# untuk mengurutkan penurunan menggunakan tanda hubung sebelum nama bidang
# sama seperti dengan filter Anda dapat menggunakan garis bawah ganda untuk mengakses bidang terkait
# Gaya Django
Buku = (
Tunggu Book.objeks.filter (penulis _ _ name _ _ icontains = "tolkien")
. order _ by ("-tahun")
. Semua ()
)
# gaya python
Buku = (
Tunggu Book.objeks.filter (Book.author.name ikontains ("tolkien"))
order _ by (Book.year.desc ())
. Semua ()
)
Assert len (buku) = = 3
Buku yang ditegaskan [0]. judul = = "Silmarillion"
Buku-buku yang ditegaskan [2]. judul = = "The Hobbit"
# untuk membaca lebih lanjut tentang penyaringan dan pemesanan
# kunjungi: https://collerek.github.io/ormar/queries/filter-and-sort/
Async def subset _ of _ columns ():
# untuk mengecualikan beberapa kolom dari pemuatan saat menanyakan database
# Anda dapat menggunakan metode fileds ()
Hobbit = await Book.objects.fields (["judul"]).get (judul = "The Hobbit")
# perhatikan bahwa ladang yang tidak termasuk dalam ladang kosong (diatur ke Tidak Ada)
Tegaskan hobbit. tahun Tidak Ada
Tegaskan hobbit.author Tidak Ada
# bidang yang dipilih ada di sana
Tegaskan hobbit.title = = "The Hobbit"
# alternatif Anda dapat menyediakan kolom yang ingin Anda kecualikan
Hobbit = menunggu Book.objeks.exde _ fields (["tahun"]).get (judul = "The Hobbit")
# Tahun masih belum ditetapkan
Tegaskan hobbit. tahun Tidak Ada
# tapi author kembali
Tegaskan hobbit.author tidak ada
# juga Anda tidak dapat mengecualikan kolom kunci utama - selalu ada
# bahkan jika Anda SANGAT mengecualikannya, itu akan ada di sana
# perhatikan bahwa setiap model memiliki jalan pintas untuk kolom utama _ kunci yaitu pk
# dan Anda dapat memfilter / mengakses / mengatur nilai dengan alias ini seperti di bawah ini
Tegaskan hobbit.pk tidak ada
# perhatikan bahwa Anda tidak dapat mengecualikan bidang yang tidak dapat dibatalkan
# (wajib) dalam definisi model
Coba:
await Book.objeks.exde _ fields (["judul"]).get (judul = "The Hobbit")
Kecuali pydantic. ValidationError:
Cetak ("Tidak dapat mengecualikan judul bidang yang tidak dapat dibatalkan")
# untuk membaca lebih lanjut tentang memilih subset kolom
# kunjungi: https://collerek.github.io/ormar/queries/select-columns/
Sinkronisasi def pagination ():
# untuk membatasi jumlah baris yang dikembalikan batas penggunaan ()
Buku = menunggu Book.objeks.limit (1).all ()
Assert len (buku) = = 1
Buku-buku yang ditegaskan [0]. judul = = "The Hobbit"
# untuk mengimbangi jumlah baris yang dikembalikan menggunakan offset ()
Buku = menunggu Book.objeks.limit (1).offset (1).all ()
Assert len (buku) = = 1
Buku yang ditegaskan [0]. judul = = "Penguasa Cincin"
# alternatif gunakan paginate yang menggabungkan keduanya
Buku = menunggu Book.objeks.paginate (halaman = 2, halaman _ size = 2).all ()
Assert len (buku) = = 2
# perhatikan bahwa kami menghapus satu buku Sapkowski dalam hapus ()
# dan membuat ulang The Silmarillion - secara default ketika tidak ada pesanan _ by yang disetel
# memesan macam berdasarkan kolom utama _ kunci
Buku yang ditegaskan [0]. judul = = "Sang Penyihir"
Buku yang ditegaskan [1]. judul = = "Silmarillion"
# untuk membaca lebih lanjut tentang paginasi dan jumlah baris
# kunjungi: https://collerek.github.io/ormar/queries/pagination-and-rows-number/
Asinkron agregasi def ():
# menghitung:
Tegaskan 2 = = tunggu Author.objekt.count ()
# ada
Penegasan menunggu Book.objeks.filter (judul = "The Hobbit").exist ()
# maksimal
Tegaskan 1990 = = menunggu Book.objeks.max (kolom = ["tahun"])
# minimal
Tegaskan 1937 = = menunggu Book.objeks.min (kolom = ["tahun"])
# rata-rata
Tegaskan 1964.75 = = menunggu Book.objeks.avg (kolom = ["tahun"])
# menjumlahkan
Tegaskan 7859 = = menunggu Book.objeks.sum (kolom = ["tahun"])
# untuk membaca lebih lanjut tentang fungsi agregat
# kunjungi: https://collerek.github.io/ormar/queries/aggregations/
Async def raw _ data ():
# ekstrak data mentah dalam bentuk dicts atau tuples
# perhatikan bahwa ini melewatkan validasi (!) sebagai model
# tidak dibuat dari data yang diurai
# dapatkan daftar objek sebagai dekrit
Tegaskan menunggu Book.objeks.value () = = [
{"id": 1, "author": 1, "title": "The Hobbit", "year": 1937},
{"id": 2, "author": 1, "title": "The Lord of the Rings", "year": 1955},
{"id": 4, "author": 2, "title": "The Witcher", "year": 1990},
{"id": 5, "author": 1, "title": "The Silmarillion", "year": 1977},
]
# dapatkan daftar objek sebagai tupel
Tegaskan menunggu Book.objeks.value _ list () = = [
(1, 1, "Sang Hobbit," 1937),
(2, 1, "Penguasa Cincin," 1955),
(4, 2, "Sang Penyihir," 1990),
(5, 1, "Silmarillion," 1977),
]
# data filter - perhatikan bagaimana Anda selalu mendapatkan daftar
Tegaskan menunggu Book.objeks.filter (judul = "The Hobbit").nilai () = = [
{"id": 1, "author": 1, "title": "The Hobbit", "year": 1937}
]
# pilih hanya bidang yang diinginkan
Tegaskan menunggu Book.objeks.filter (judul = "The Hobbit").nilai (["id," "judul"]) = = [
{"id": 1, "title": "The Hobbit"}
]
# jika Anda hanya memilih satu kolom, Anda dapat meratakannya dengan nilai _ daftar
Tegaskan menunggu Book.objeks.value _ list ("judul," ratakan = Benar) = = [
"Sang Hobbit,"
"Penguasa Cincin,"
"Sang Penyihir,"
"Silmarillion,"
]
# untuk membaca lebih lanjut tentang mengekstraksi nilai mentah
# kunjungi: https://collerek.github.io/ormar/queries/aggregations/
Sinkronisasi def dengan _ connect (fungsi):
# perhatikan bahwa untuk backend lain selain sqlite Anda benar-benar perlu
# hubungkan ke database untuk melakukan operasi db
Sinkronisasi dengan database:
Fungsi menunggu ()
# perhatikan bahwa jika Anda menggunakan kerangka kerja seperti `fastapi`, Anda tidak boleh terhubung
# di titik akhir Anda tetapi memiliki kumpulan koneksi global
# periksa bagian https://collerek.github.io/ormar/fastapi/and dengan koneksi db
# kumpulkan dan jalankan semua fungsi
# note - biasanya impor harus berada di awal file
asyncio impor
# perhatikan bahwa biasanya Anda menggunakan fungsi mengumpulkan () untuk menjalankan beberapa fungsi
# secara bersamaan tetapi kami benar-benar memodifikasi data dan kami mengandalkan urutan fungsi
Untuk func di [
Membuat,
Membaca,
Perbarui,
Menghapus,
Bergabung,
filter _ dan _ sortir,
subset _ dari _ kolom,
Paginasi,
Agregasi,
mentahan _ data,
]:
Cetak (f "Menjalankan:{func.__name__}")
asyncio.run (dengan _ connect (func))
# jatuhkan tabel database
jatuhkan _ semua (mesin)
|
Spesifikasi Umar
Metode Setelan Kueri
Pembuatan* (**kwargs): - > model
* get(*args, **kwargs): -> Model
* get_or_none(*args, **kwargs): -> Optional[Model]
* get_or_create(_defaults: Optional[Dict[str, Any]] = None, *args, **kwargs) -> Tuple[Model, bool]
* first(*args, **kwargs): -> Model
* update(each: bool = False, **kwargs) -> int
* update_or_create(**kwargs) -> Model
* bulk_create(objects: List[Model]) -> None
* bulk_update(objects: List[Model], columns: List[str] = None) -> None
* delete(*args, each: bool = False, **kwargs) -> int
* all(*args, **kwargs) -> List[Optional[Model]]
* iterate(*args, **kwargs) -> AsyncGenerator[Model]
* filter(*args, **kwargs) -> QuerySet
* exclude(*args, **kwargs) -> QuerySet
* select_related(related: Union[List, str]) -> QuerySet
* prefetch_related(related: Union[List, str]) -> QuerySet
* limit(limit_count: int) -> QuerySet
* offset(offset: int) -> QuerySet
* count(distinct: bool = True) -> int
* Keberadaan () - > Boolean
* max(columns: List[str]) -> Any
* min(columns: List[str]) -> Any
* avg(columns: List[str]) -> Any
* sum(columns: List[str]) -> Any
* fields(columns: Union[List, str, set, dict]) -> QuerySet
* exclude_fields(columns: Union[List, str, set, dict]) -> QuerySet
* order_by(columns:Union[List, str]) -> QuerySet
* values(fields: Union[List, str, Set, Dict])
* values_list(fields: Union[List, str, Set, Dict])
tipe hubungan
- Satu-ke-Banyak - Menggunakan ForeignKey (untuk: Model)
- Banyak untuk banyak - dengan
ManyToMany(to: Model, Optional[through]: Model)
Tipe bidang model
Bidang model yang tersedia (dengan parameter yang diperlukan - opsional dalam dokumen):
- String (panjang maksimum)
- Teks ()
- Boolean ()
- Integer ()
- Mengambang ()
- Tanggal ()
- Waktu ()
- Waktu Tanggal ()
JSON()
- Bilangan bulat besar ()
- Bilangan bulat kecil ()
- Desimal (jumlah tempat desimal, presisi)
UUID()
- Biner besar (panjang maksimum)
- Pencacahan (kelas pencacahan)
- Pencacahan seperti lapangan - dengan melewati seleksi ke jenis Lapangan lainnya
- EncryptedString - pass enkripsi\ _ rahasia dan enkripsi\ _ backend
- Kunci asing (untuk)
- Banyak untuk banyak (untuk)
Opsi lapangan yang tersedia
Semua jenis bidang mendukung parameter kata kunci berikut.
- Kunci Utama: Boolean
- Nullable: Boolean
- Nilai default: apa saja
- Default Server: Apa saja
- Indeks: Boolean
- Unik: Boolean
- Nama: str
Semua bidang diperlukan kecuali salah satu dari berikut ini ditetapkan:
- Nullable - Buat kolom nullable. Atur default ke Salah. Baca parameter umum bidang untuk informasi lebih lanjut.
- sql\ _ nullable - Digunakan untuk mengatur pengaturan yang berbeda untuk pydantic dan database. Atur default ke nilai nullable. Baca parameter umum bidang untuk detail.
- Default - Menetapkan nilai default untuk sebuah bidang. Tidak berlaku untuk bidang relasional
- server\ _ default - Mengatur nilai default untuk bidang sisi server (seperti sqlalchemy 's func.now ()). Tidak berlaku untuk bidang relasional
- Kunci utama dengan kenaikan otomatis - Ketika kolom diatur sebagai kunci utama dan kenaikan otomatis diatur pada kolom itu. Secara default, kunci utama int mengatur kenaikan otomatis.
sinyal yang tersedia
Sinyal memungkinkan fungsi Anda dipicu untuk acara tertentu pada model tertentu.
- pra-simpan
- Setelah menabung
- pra-pembaruan
- Setelah pembaruan
- pra-hapus
- setelah penghapusan
- penambahan pra-hubungan
- pasca hubungan tambahkan
- penghapusan pra-hubungan
- Setelah menghapus hubungan