Zum Inhalt

nach Ormar

Pypi version [Bearbeiten] PYPI-Version (WEB//pypi.org/project/ormar) oder Aufbau status [Deckung] [[Datei: /codecov.io/gh/collerek/ormar]][[Bearbeiten] Codefaktor](https://www.codefactor.io/repository/github/collerek/ormar/badge) [WEB und

Zusammenfassung

Das ormar-Paket ist Pythons asynchrones ORM, das Postgres, MySQL und SQLite unterstützt.

Die wichtigsten Vorteile der Verwendung von Ormar sind:

  • Erhalten Sie asynchrone ORM, die mit asynchronen Frameworks (fastapi, starlette usw.) verwendet werden können
  • verwaltet nur ein Modell-Sie müssen keine Pydantic-und ORM-Modelle pflegen (sqlalchemy, peewee, gino usw.)

Das Ziel war es, einen einfachen ORM zu erstellen, der direkt mit den auf pydantic basierenden Fastapi zur Datenvalidierung (als Anfrage-und Antwortmodell) verwendet werden kann.

Ormar-mit Ausnahme des offensichtlichen „ ORM "im Namen-leitet seinen Namen vom schwedischen ormar ab, was Schlange bedeutet, und vom kroatischen ormar (e), was Kabinett bedeutet.

Gibt es einen besseren Namen für Python ORM als Snakes Cabinet?:)

Wenn Ihnen Ormar gefällt, denken Sie daran, Ihr Repository auf Github mit einem Stern zu versehen!

Je größer die Community ist, die wir aufgebaut haben, desto einfacher ist es, Fehler zu finden und Mitwirkende zu gewinnen;)

Das Archiv

Schauen Sie sich die Archive für detaillierte Informationen an.

Beachten Sie, dass aus Gründen der Kürze die meisten Dokumentationsfragmente die Erstellung und Planung der Ausführung von asynchronen Laufzeitfunktionen für Datenbanken weglassen.

Wenn Sie mehr Beispiele aus dem wirklichen Leben als in der Dokumentation wünschen, können Sie sich den Testordner ansehen, da diese tatsächlich während der meisten Tests erstellt und mit einer Datenbank verbunden werden müssen.

Denken Sie jedoch daran, dass dies nur Tests sind und nicht alle Lösungen für den Einsatz im realen Leben geeignet sind.

Teil des fastapi-Ökosystems

Als Teil des Fastapi-Ökosystems wird ormar in ausgewählten Bibliotheken unterstützt, die auf die eine oder andere Weise mit der Datenbank arbeiten.

Ormar ist immer noch unabhängig vom SQL-Dialekt-daher werden nur Spalten implementiert, die in allen unterstützten Back-Ends funktionieren.

Als Erweiterung von Ormar ist es relativ einfach, Spalten in einem bestimmten Dialekt zu implementieren.

Spaltenspezifische Postgres-Implementierung: ormar-postgres-extensions

Wenn Sie eine andere Bibliothek verwalten oder verwenden und möchten, dass sie ormar unterstützt, teilen Sie uns bitte mit, wie wir Ihnen helfen können.

Abhängigkeitsverhältnis

Ormars Aufbau besteht aus:

  • Der sqlalchemy-Kern zum Erstellen von Abfragen.
  • Eine Datenbank, die über die Datenbank hinweg unterstützt wird.
  • Pydantic wird zur Datenüberprüfung verwendet.

Lizenzen

Ormar wurde als Open-Source-Software entwickelt und wird völlig kostenlos bleiben (MIT-Lizenz).

Wenn ich Open-Source-Code schreibe, um alltägliche Probleme bei der Arbeit zu lösen oder eine starke Python-Community zu fördern und aufzubauen, können Sie sich bedanken und mich um eine Tasse Kaffee bitten oder mich monatlich unterstützen, um sicherzustellen, dass meine Arbeit kostenlos und gepflegt bleibt.

Patenschaft

Migrieren von sqlalchemy und vorhandenen Datenbanken

Wenn Sie derzeit sqlalchemy verwenden und zu ormar wechseln möchten, sollten Sie sich das Tool für automatische Übersetzung ansehen, mit dessen Hilfe Sie vorhandene sqlalchemy orm-Modelle übersetzen können, damit Sie dies nicht manuell tun müssen.

Beta-Versionen finden Sie auf github: sqlalchemy-to-ormar oder einfach pip install sqlalchemy-to-ormar

sqlalchemy-to-ormar kann zusammen mit sqlacodegen verwendet werden, um Ormar-Modelle automatisch aus vorhandenen Datenbanken abzubilden/zu generieren, auch wenn Ihr Projekt sqlalchemy nicht verwendet.

Migration und Erstellung von Datenbanken

Da ormar auf dem SQLAlchemy-Kern basiert, können Sie alembic verwenden, um die Datenbankmigration bereitzustellen (was Sie für Produktionscode tun sollten).

Für Tests und grundlegende Anwendungen reicht sqlalchemy aus:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
#Hinweis: Dies ist nur ein partieller Snippet, der vollständig funktioniert.
#1 Importieren
Import von Sqlalchemy
Importieren von Datenbanken
Der Import von Ormar

#2 Initialisierung
DATABASE_URL ="sqlite://db. sqlite"[Bearbeiten | Quelltext bearbeiten]
Die Abbildung zeigt die Konfidenzintervalle für die Konfidenzintervalle: (
    metadata = sqlalchemy. metadata (), oder
    Datenbank = Datenbank. Datenbank (DATABASE_URL),
    . create_engine = sqlalchemy (DATABASE_URL) und
)

Definieren von Modellen hier

3. Erstellung von Datenbanken und Tabellen
Startseite_Datei. metadata. create_all (engine)

Die Beispielkonfiguration von alembic und weitere Informationen zu Migrationen und Datenbankerstellung finden Sie im Abschnitt Dokumentation zur Migration.

Gekapselte Version

ormar ist noch in der Entwicklung: es wird empfohlen, Abhängigkeiten zu fixieren (d.h. ormar ~= 0.9.1)

Ormar folgt auch der Release-Nummer, die besagt, dass wichtige Änderungen die Hauptversionsnummer erhöhen, während andere Änderungen und Korrekturen die Nebenversionsnummer erhöhen, so dass Sie für letztere sicher aktualisieren können, aber achten Sie darauf, zuerst die Release-Dokumentation zu lesen example: (0.5.2 -> 0.6.0 - breaking, 0.5.2 -> 0.5.3 - non breaking).

Verwirrung mit Python

Beachten Sie, dass ormar ein asynchrones ORM ist, was bedeutet, dass Sie auf einen Aufruf der Methode warten müssen, die Sie in einer Ereignisschleife ausführen möchten Python hat ein eingebautes Modul asyncio, mit dem Sie dies tun können.

Beachten Sie, dass die meisten "normalen" Python-Interpreter das Ausführen von "wait" außerhalb einer Funktion nicht zulassen (da Sie tatsächlich planen, dass diese Funktion die Ausführung verzögert und kein sofortiges Ergebnis erhält).

In modernen Web-Frameworks wie Fastapi wird das Framework dieses Problem für Sie lösen, aber wenn Sie es selbst tun möchten, müssen Sie es manuell tun, wie in den Schnellstarts unten beschrieben.

schnellen Eintritt.

Beachten Sie, dass Sie das gleiche Skript im Beispielordner auf GitHub finden.

  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
from typing import optional/vom Typ des optionalen Imports

Import von Datenbanken

Der Import von Ormar
Import von Sqlalchemy

DATABASE_URL ="sqlite://db. sqlite"[Bearbeiten | Quelltext bearbeiten]
Die Abbildung zeigt die Konfidenzintervalle für die Konfidenzintervalle: (
    metadata = sqlalchemy. metadata (), oder
    Datenbank = Datenbank. Datenbank (DATABASE_URL),
    . create_engine = sqlalchemy (DATABASE_URL) und
)

#note that this step is optional-"Alle Ormaan-Autos sind ein Feld mit Namen"
#ormar_config #und Parameter, aber auf diese Weise müssen Sie sie nicht wiederholen
dieselben Parameter, wenn Sie nur eine Datenbank verwenden
#
Hinweis : Alle Hints sind optional .
Below ist eine perfekte gültige Modelldeklaration
Klasse Autor (ormar . Modell) :
#     ormar _ config = base _ ormar _ config . copy (tablename = " Autoren ")
#
#     Integer (primary _ key = true) # # # notice no field types (keine Feldtypen)
#     name = ormar . String (max _ length = 100) [ Bearbeiten | Quelltext bearbeiten ]


Klasse Autor (ormar . Modell) :
    ormar _ config = base _ ormar _ config . copy (tablename = " Autoren ")

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


Klasse Buch (ormar . model) :
    ormar _ config = base _ ormar _ config . copy (tablename = " Bücher ")

    id : int = ormar . Integer (primary _ key = true) (nicht bekannt)
    author : Optional [ Autor ] = ormar . ForeignKey (Autor)
    title : str = ormar . String (max _ length = 100)
    Jahr : int = ormar . Integer (nullable = true)


# Erstellen der Datenbank
Hinweis : Bei der Produktion sollten Sie Migrationen verwenden
Hinweis : Dies ist nicht erforderlich , wenn Sie eine Verbindung zu einer bestehenden Datenbank herstellen
" Wir müssen nur sicher sein , bevor wir die DB sauber machen "
Startseite _ ormar _ config . metadata . drop _ all (engine)
Startseite _ Datei . metadata . create _ all (engine)


# Alle Funktionen sind in die Funktionalitätskategorien unterteilt
Wie alle Funktionen mit Async definiert sind - wie Async verwendet werden kann und benötigt wird
# Sei stolz auf dich selbst
async def create () erstellen
    Erstellen Sie einige Einträge , um mit QuerySet zu arbeiten . create method .
    Hinweis : Queryset wird auf jeder Model 's class als Objekt angegeben
    tolkien = await Autor . objects . create (name = " J.R.R. Tolkien ")
    await Book . objects . create (author = tolkien , title = " Der Hobbit " , Jahr = 1937)
    await Book . objects . create (author = tolkien , title = " Der Herr der Ringe " , year = 1955)
    await Book . objects . create (author = tolkien , title = " The Silmarillion " , Jahr = 1977)

    # Alternative Kreation von Objekten in 2 Schritten unterteilt
    sapkowski = Autor (name = " Andrzej Sapkowski ")
    # Machen Sie Stuff
    Await istsapkowski.save()

    oder Save () after initialization
    await Book (author = sapkowski , title = " The Witcher " , Jahr = 1990) . save ()
    await Book (author = sapkowski , title = " Der Turm der Narren " , year = 2002) . save ()

    Lesen Sie mehr über die Integration von Daten in die Datenbank
    # Besichtigung :https://collerek.github.io/ormar/queries/create/


async def read () : ((auf Englisch))
    # Fetch eine Instanz , ohne eine foreign key relationship auf sie zu richten .
    Der Django Stil
    book = await Book . objects . get (title = " Der Hobbit ")
    Python oder Python-Style
    book = await Book . objects . get (Book . title = = " Der Hobbit ")
    book2 = await Book . objects . first () (Buch . Objekt . erste ())

    # first () fetch the instance with lower primary key value (erste () Zahl mit niedrigerem Primärschlüsselwert)
    < ! - > Bücher = > Bücher

    Du kannst alle Felder auf das geladene Modell zugreifen
    title = = " Der Hobbit "
    assert book . year = 1937 (Jahr)

    Wenn keine Bedingung erfüllt ist ()
    # it behaves as last () based on primary key column # es behaves as last () basiert auf der Primärschlüssel-Spalte
    book3 = await Book . objects . get () = Buch erstellen . objects . get ()
    Titel : " Der Turm der Narren "

    Wenn Sie eine Beziehung haben , definiert Ormar immer ein relatives Modell für Sie
    Jeder Moment , den Sie geladen haben , ist ein ausländischer Schlüsselwert wie in diesem Beispiel
    assert isinstance (book.author , Autor) Bearbeiten
    # Primärer Schlüssel ist vom Fremdschlüssel in der Tabelle der Bücher gespeichert
    Assert hinzufügenbook.author.pk= = 1 ist
    Seit das relative Modell nicht alle anderen Felder geladen hat , sind keine
    Assert hinzufügenbook.author.nameist keines

    Laden Sie die Beziehung aus der Datenbank heraus , wenn Sie bereits ein relatives Modell haben
    # alternatively see joins section below (alternatively siehe Abschnitt unten)
    Das Buch . author . load ()
    Assert hinzufügenbook.author.name= = " J.R.R. Tolkien " = = = " J.R.R. Tolkien " oder " J.R.R. Tolkien "

    # Get all rows for given model (Alle Wege für das Geben von Modellen)
    authors = await Autor . Objekt . Alle ()
    assert len (Autoren) = 2

    Lesen Sie mehr über das Lesen von Daten aus der Datenbank
    # besuchen :https://collerek.github.io/ormar/queries/read/


async def update () () : Siehe auch :
    # Lesen Sie die aktuelle Zeile aus DB
    tolkien = await Author . objects . get (name = " J.R.R. Tolkien ")
    Assert hinzufügentolkien.name= = " J.R.R. Tolkien " = = = " J.R.R. Tolkien " oder " J.R.R. Tolkien "
    Türchen _ id =tolkien.id

    Ändern des ausgewählten Eigentums
    tolkien.name (Weitergeleitet von John Ronald Reuel Tolkien)
    Call update on a model instance (Update auf eine Modellinstanz)
    Das ist ein Witz . update ()

    Bestätigung , dass das Objekt aktualisiert wurde
    tolkien = await Author . objects . get (name = " John Ronald Reuel Tolkien ") [ Bearbeiten ]
    Assert hinzufügentolkien.name(Weitergeleitet von John Ronald Reuel Tolkien)
    Assert hinzufügentolkien.idDie _ id

    # alternatively update Daten ohne Loading
    await Author . objects . filter (name _ _ contains = " Tolkien ") . update (name = " J.R.R. Tolkien ") (Datei : J.R.R. Tolkien ")

    Lesen Sie mehr über die Aktualisierung der Datenbank .
    # besuchen :https://collerek.github.io/ormar/queries/update/


async def delete () :
    silmarillion = await Book . objects . get (Jahr = 1977)
    # call delete () auf Instanz
    await silmarillion . delete () (Englisch)

    # alternatively delete without loading # alternatively delete ohne Loading
    await Book . objects . delete (title = " Der Turm der Narren ")

    # note that when there is no record ormar raises nomatch exception # # Hinweis , wenn es keine Aufnahme gibt
    versuchen :
        await Book . objects . get (Jahr = 1977)
    Mit Ausnahme von Ormar . NoMatch :
        (" Kein Buch von 1977 ! ")

    Lesen Sie mehr über Daten aus der Datenbank
    # Besichtigung :https://collerek.github.io/ormar/queries/delete/

    # Hinweis , dass trotz der Tatsache , dass es keine Longer Exists in der Datenbank erfasst
    # Das Objekt oben ist immer noch akzeptabel und Sie können es verwenden (und ich . e . speichern)) wieder .
    Tolkiensilmarillion.author
    await Book . objects . create (author = tolkien , title = " The Silmarillion " , Jahr = 1977)


async def joins () (Hinzufügen) :
    # Sie verbinden zwei Modelle mit select _ related

    Der Django Stil
    Beschreibung = AwaitBook.objects.select_ related (" Autor ") . get (title = " Der Hobbit ")
    Der Python-Stil
    Bücher = AwaitBook.objects.selectBuchbeschreibung : (
        Titel : Der Hobbit
    )

    Der Autor ist bereits vorbereitet
    Assert hinzufügenbook.author.name= = " J.R.R. Tolkien " = = = " J.R.R. Tolkien " oder " J.R.R. Tolkien "

    Wenn Sie dies tun , erhalten Sie ebenfalls eine zweite Seite der Beziehung .
    # constructed as lowercase source model name + 's ' (Bücher in diesem Fall)
    # Sie können auch benutzerdefinierte Namen mit Parametern im Zusammenhang mit _ Namen bereitstellen

    Der Django Stil
    Benutzer = awaitAuthor.objects.select_ related (" Bücher ") . all (name = " J.R.R. Tolkien ")
    Der Python-Style
    Benutzer = awaitAuthor.objects.selectAlle Bücher (Autor , Autor)
        Author.name = = " J.R.R. Tolkien " = = = " J.R.R. Tolkien " oder " J.R.R. Tolkien "
    )
    assert len (author [ 0 ] . books) = 3 oder weniger

    # für umgekehrt und viele bis viele Beziehungen , die Sie auch voraussehen können
    Dies führt eine separate Abfrage für jedes verwandte Modell aus

    Der Django Stil
    author = await Author . objects . prefetch _ related (" Bücher ") . get (name = " J.R.R. Tolkien ") (author = await Autor . objects . prefetch _ related (" Bücher ") . get (name = " J.R.R. Tolkien ")
    Der Python-Style
    Die Seite wurde neu angelegt : " _
        Author.name = = " J.R.R. Tolkien " = = = " J.R.R. Tolkien " oder " J.R.R. Tolkien "
    )
    assert len (author . books) = 3 oder weniger

    Lesen Sie mehr über Beziehungen
    # Besichtigung :https://collerek.github.io/ormar/relations/

    Lesen Sie hier mehr über Ergänzungen und Ergänzungen
    # Besichtigung :https://collerek.github.io/ormar/queries/joins-and-subqueries/


async def filter _ und _ sort () :
    # to filter the query you can use filter () or pass key - value pars to Die Abfrage filtern , die Sie verwenden können Filter () oder pass key - Wert für
    # get () , all () und so weiter .
    # Verwenden Sie spezielle Methoden oder Zugriff auf verwandte Modellfelder mit Doppelfunktion
    # underscore like to filter by the name of the author unter Verwendung des author _ _ name
    Der Django Stil
    books = await Book . objects . all (author _ _ name = " J.R.R. Tolkien ") Bearbeiten
    Der Python Style
    Die Seite wurde neu angelegt : " Alle Objekte , alle Objekte , alle Objekte " (Book.author.name= = " J.R.R. Tolkien " (= = " J.R.R. Tolkien ")
    Anzahl der Bücher (= 3)

    # filter kann auch spezielle Methoden mit doppeltem Underscore trennen
    SQL Query ` where authors.name like "%tolkien%"` ist nicht
    Case Sensitive (kleiner Fehler in Tolkien)
    Der Django Stil
    books = await Book . objects . filter (author _ _ name _ _ icontains = " tolkien ") . all () ()
    Der Python Style
    books = await Book . objects . filter (Book . author . name . icontains (" tolkien ")) . all ()
    Anzahl der Bücher (= 3)

    Sortieren der Reihenfolge _ by () Funktion des Queryset
    #
    Wie mit einem Filter können Sie doppelte Underscores verwenden , um verwandte Felder zu erreichen
    Der Django Stil
    Bücher : (
        await Book . objects . filter (author _ _ name _ _ icontains = " tolkien ") (Deutsch)
        ORDER _ BY (" - Jahr ")
        Das All ()
    )
    Der Python Style
    Bücher (
        await Book . objects . filter (Book . author . name . icontains (" Tolkien ")) Bearbeiten
        ORDER _ BY (Buch . Jahr . desc ()))
        Das All ()
    )
    Anzahl der Bücher (= 3)
    assert books [ 0 ] . title = = " Die Silmarillion "
    [ 2 ] . title = = " Der Hobbit "

    Lesen Sie hier mehr über das Filtern und Arbeiten
    # besuchen :https://collerek.github.io/ormar/queries/filter-and-sort/


async def subset _ of _ columns ()
    Einige Spalten beim Abfragen der Datenbank auslesen
    Sie können die Methode Fileds () verwenden .
    Hobbit = await Book . objects . fields ([ " title " ]) . get (title = " The Hobbit ") [ Bearbeiten | Quelltext bearbeiten ]
    " Fields not included in Fields are empty " (" Es ist kein Platz ")
    assert hobbit - Jahr ist None
    Assert hinzufügenhobbit.authorist keines

    Das ausgewählte Feld ist dort
    Der Hobbit title = = " Der Hobbit "

    # alternatively you can provide columns you want to exclude # alternatively you can provide columns you want to exclude
    hobbit = await Book . objects . exclude _ fields ([ " Jahr " ]) . get (title = " Der Hobbit ")
    Das Jahr ist noch nicht gesetzt
    assert hobbit - Jahr ist None
    Der Autor ist zurück
    Assert hinzufügenhobbit.authorist nicht keiner

    Daher können Sie den Primärschlüssel nicht aus der Spalte entfernen - es ist immer da
    # auch wenn du es ausdrücklich schließt , wird es da sein

    # note , dass jedes Modell einen Shortcut für den Primärschlüssel column hat , der PK ist
    # and you can filter/access/set the values by this alias like below/
    Assert hinzufügenhobbit.pkist nicht keiner

    # Hinweis , dass Sie Fields , die nicht Nullbar sind , nicht ausschliessen können
    # (erforderlich) In der Modelldefinition
    versuchen :
        await Book . objects . exclude _ fields ([ " title " ]) . get (title = " Der Hobbit ")
    Mit Ausnahme von Pydantic . ValidationError :
        print (" Kann nicht Null-Feld - Titel ")

    Lesen Sie mehr über die Auswahl der Felder
    # besuchen :https://collerek.github.io/ormar/queries/select-columns/


async def pagination () : def pagination () für :
    Begrenzung der Anzahl der zurückgegebenen Straßen mit Limit ()
    books = await Book . objects . limit (1) . all () () () [ Bearbeiten | Quelltext bearbeiten ]
    assert len (Bücher) = 1
    [ 0 ] . title = = " Der Hobbit "

    # to offset number of returned rows use offset () Anzahl der zurückgegebenen Rows unter Verwendung von Offset ()
    books = await Book . objects . limit (1) . offset (1) . all () oder ()
    assert len (bücher) = 1
    Titel = = " Der Herr der Ringe "

    # alternatively use paginate that combines both (alternativlos verwenden , das beide verbindet)
    books = await Book . objects . paginate (page = 2 , page _ size = 2) . all ()
    assert len (bücher) = 2
    # note that we removed one book of Sapkowski in delete (Wir haben ein Buch von Sapkowski entfernt)
    # and recreated The Silmarillion - by default when no order _ by is set (" Das Silmarillion - von default , wenn keine Reihenfolge _ by gesetzt ist ")
    Sortieren von primären _ key column
    assert books [ 0 ] . title = = " The Witcher " (" Die Hexe ")
    assert books [ 1 ] . title = = " Die Silmarillion "

    Lesen Sie mehr über die Reise und die Anzahl der Straßen
    # besuchen :https://collerek.github.io/ormar/queries/pagination-and-rows-number/


async def aggregationen () :
    Der Count :
    assert2 = = await Author . objects . count () () ist ein Objekt .

    # existieren
    assert await Book . objects . filter (title = " Der Hobbit ") . exists ()

    # Höchstleistung
    assert1990 = = await Book . objects . max (columns = [ " year " ]) [ Bearbeiten | Quelltext bearbeiten ]

    # Mindestmaße
    assert1937 = = await Book . objects . min (columns = [ " year " ]) [ Bearbeiten | Quelltext bearbeiten ]

    # durchschnittlich
    assert1964.75 = = await Book . objects . avg (columns = [ " year " ]) [ Bearbeiten | Quelltext bearbeiten ]

    # sum
    assert7859 = = await Book . objects . sum (columns = [ " year " ]) [ Bearbeiten | Quelltext bearbeiten ]

    Lesen Sie mehr über Aggregat-Funktionen
    # Besichtigung :https://collerek.github.io/ormar/queries/aggregations/


async def raw _ data () () () () : () für raw _ data ()
    Extract raw data in a form of dicts or tuples (Extrakte Daten in einer Form von Dikten oder Mustern)
    Diese Tipps sind gültig (!) als Modelle
    # nicht aus parsed-daten erstellt

    # get list of objects as dicts (Liste von Objekten als Objekte erstellen)
    assert await Book . objects . values () = [ Bearbeiten | Quelltext bearbeiten ]
        {"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},
    ]

    # get list of objects as tuples (Liste von Objekten als Objekte)
    assert await Book . objects . values _ list () = = [ Bearbeiten | Quelltext bearbeiten ]
        (1 , 1937 , Der Hobbit)
        (2 , 1 , " Der Herr der Ringe " , 1955)
        (4 , 2 , Der Witcher , 1990)
        (5 , 1 , Das Silmarillion , 1977)
    ]

    # filter Daten - Notiz , wie Sie immer eine Liste bekommen
    assert await Book . objects . filter (title = " Der Hobbit ") . values () = = [
        {"id": 1, "author": 1, "title": "The Hobbit", "year": 1937}
    ]

    Wählen Sie nur gewünschte Felder aus
    assert await Book . objects . filter (title = " Der Hobbit ") . values ([ " id " , " title " ]) = [
        {"id": 1, "title": "The Hobbit"}
    ]

    # if you select only one column you could flatten it with values _ list Wenn Sie nur eine Spalte auswählen , die Sie mit Werten füllen könnten
    assert await Book . objects . values _ list (" title " , flatten = true) = = [ [
        „ Der Hobbit "
        Der Herr der Ringe
        Der „ Witcher "
        „ Das Silmarillion "
    ]

    Lesen Sie mehr über Extracting Raw Values
    # Besichtigung :https://collerek.github.io/ormar/queries/aggregations/


async def mit _ connect (function) :
    # Hinweis , dass für einen anderen Hintergrund als genau das , was Sie wirklich brauchen
    Verbinden Sie die Datenbank mit den DB-Operationen
    async mit der Datenbank :
        Die Funktion ist ()

    Wenn Sie ein Framework wie `fastapi` verwenden , sollten Sie keine Verbindung herstellen
    In Ihren Endpunkten , aber mit einem globalen Verbindungspool
    # Prüfenhttps://collerek.github.io/ormar/fastapi/and section mit DB-Verbindung


# Alle Funktionen ausführen
Normalerweise sollte der Import am Anfang der Datei erfolgen .
Import aus Asyncio

Normalerweise verwenden Sie gather () - Funktion , um mehrere Funktionen auszuführen
concurrently but we actually modify the data and we rely on the order of functions Wir ändern tatsächlich die Daten und wir beziehen uns auf die Reihenfolge der Funktionen
function im [
    erschaffen ,
    Weiterlesen ,
    Aktualisierung ,
    löschen ,
    Joins ,
    filter und _ sort
    subset _ of _ columns (von _ columns)
    Die Vagina ,
    Die Aggregation ,
    raw _ daten ,
]:
    print (f) Ausführung: {func.__name__}")
    asyncio.run(with_ connect (Funktion)

Löschen der Tabellen der Datenbank
metadata . drop _ all (englisch)

Besonderheiten von Omar

Fragen zu Sammelmethoden

  • Erzeugen (**kwargs) : - > Modell
  • 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
  • vorhanden () - > boolesche Werte
  • 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])

Relationship Typen

  • One-to - Multi-mit ForeignKey (to : Model)
  • Mehr zu - mit ManyToMany(to: Model, Optional[through]: Model)

Das Modell des Typs

Verfügbare Modellfelder (mit erforderlichen Parametern - optionale Parameter in der Dokumentation) :

  • String (maximale Länge)
  • Der Text ()
  • Der Wert ()
  • Ganzzahl ()
  • Floß ()
  • Das Datum ()
  • Zeit ()
  • Datum Zeit ()
  • JSON()
  • große Zahl ()
  • kleine Zahl ()
  • Kleine Zahlen (Anzahl, Genauigkeit)
  • UUID()
  • 2 (maximale Länge)
  • Aufzählungen (Kategorien)
  • Eine Enumeration ähnlich einem Feld-durch Übergeben der Auswahl an einen anderen Feldtyp
  • EncryptedString-durch übergeben encrypt_secret und encrypt_backend
  • Fremdschlüssel (bis)
  • Je mehr (bis)

Auswahl der Wörter möglich

Alle Feldtypen unterstützen die folgenden Schlüsselwortparameter.

  • Primärschlüssel: Boolescher Wert
  • verfügbar: boolescher Wert
  • Standardwert: Any
  • Standardwert des Servers: Any
  • Index: Boolescher Wert
  • Einzige Ausnahme: Burr.
  • Bezeichnung: str

Sofern nicht eines der folgenden Felder gesetzt ist, sind alle Felder erforderlich:

  • nullable-Erstellen Sie eine Spalte, die leer sein kann Standardwert auf False für Details lesen Sie Allgemeine Feldparameter.
  • sql_nullable-Verwenden Sie verschiedene Einstellungen für pydantic und die Datenbank, um den Standardwert auf einen Wert zu setzen, der leer sein kann Weitere Informationen finden Sie unter Allgemeine Feldparameter.
  • Standard - Festlegen der Standardwerte für das Feld " Beziehungen " gilt nicht für das Feld " Beziehungen " .
  • server _ default - Legt die Standardwerte für serverseitige Felder fest (z.B. für sqlalchemy)func.now(1) Gilt nicht für den Zusammenhang zwischen Wörtern .
  • Primärschlüssel mit Auto-Increment - Wenn eine Spalte als Primärschlüssel festgelegt ist und automatische Inkremente auf dieser Spalte festgelegt sind , wird standardmäßig der Primärschlüssel von int auf Auto-Increment gesetzt .

Signal zur Verfügung .

Signale ermöglichen das Auslösen Ihrer Funktion für ein bestimmtes Ereignis in einem bestimmten Modell .

  • Pre-Erhaltung
  • Nach der Erhaltung
  • Vorschau aktualisiert
  • Nach dem Update
  • Pre-Streichung
  • Nach der Streichung
  • Vorher-Beziehung hinzufügen
  • Post-Beziehung hinzufügen
  • Vorhersage-Beziehung abgeschafft
  • Nach Beendigung der Beziehung