将数据插入数据库
以下方法允许您将数据插入数据库。
-
创建(**kwargs) -> 模型
-
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.save() 方法 * Model.upsert() 方法 * Model.save_lated() 方法
-
查询集代理 * QuerysetProxy.create(**kwargs)
方法 * QuerysetProxy.get_or_create(_defaults: Optional[Dict[str, Any]] = None, **kwargs)
方法 * QuerysetProxy.update_or_create(**kwargs)
方法
创造
创建(**kwargs):-> 模型
创建模型实例,将其保存在数据库中并返回更新模型(如果未传递且设置了自动增量,则填充 pk)。
允许的 kwargs 是模型字段名称和正确的值类型。
1
2
3
4
5
6
7
8
9
10
11
12
13
14 | class Album(ormar.Model):
ormar_config = ormar.OrmarConfig(
database=database,
metadata=metadata,
tablename="album"
)
id: int = ormar.Integer(primary_key=True)
name: str = ormar.String(max_length=100)
malibu = await Album.objects.create(name="Malibu")
await Track.objects.create(album=malibu, title="The Bird", position=1)
|
另一种方法是模型的拆分创建和持久化。
| malibu = Album(name="Malibu")
await malibu.save()
|
获取或创建
get_or_create(_defaults: Optional[Dict[str, Any]] = None, **kwargs) -> Tuple[Model, bool]
创建和获取方法的组合。
尝试获取满足条件的行,如果引发 NoMatch 异常,则会使用给定的 kwargs 和 _defaults 创建一个新行。
当提供 _defaults 字典时,将始终设置 _defaults 中设置的值,包括覆盖显式提供的值。 IE get_or_create(_defaults: {"title": "I win"}, title="never used")
无论您是否在 kwargs 中提供自己的价值,都将始终使用“我赢了”作为标题。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 | class Album(ormar.Model):
ormar_config = ormar.OrmarConfig(
database=database,
metadata=metadata,
tablename="album"
)
id: int = ormar.Integer(primary_key=True)
name: str = ormar.String(max_length=100)
year: int = ormar.Integer()
album, created = await Album.objects.get_or_create(name='The Cat', _defaults={"year": 1999})
assert created is True
assert album.name == "The Cat"
assert album.year == 1999
# object is created as it does not exist
album2, created = await Album.objects.get_or_create(name='The Cat')
assert created is False
assert album == album2
# return True as the same db row is returned
|
!!!警告 尽管是数据库中的等效行,但上面示例中的 album 和 album2 是 2 个不同的 python 对象!更新其中之一不会刷新第二个,直到您显式从数据库加载()新数据。
注意,如果你想创建一个新对象,你要么必须传递 pk 列值,要么 pk 列必须设置为自动增量
更新或创建
update_or_create(**kwargs) -> Model
更新模型,或者在数据库中没有匹配项的情况下创建一个新模型。
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())
|
注意,如果你想创建一个新对象,你要么必须传递 pk 列值,要么 pk 列必须设置为自动增量
批量创建
bulk_create(objects: List["Model"]) -> None
允许您一次创建多个对象。
需要传递模型对象的有效列表。
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())
|
模型方法
每个模型实例都有一组方法来保存、更新或加载自身。
###节省
您可以使用 QuerySet.create() 方法或将模型初始化为普通 pydantic 模型然后调用 save() 方法来创建新模型。
!!!tip 阅读有关 models-save 中的 save() 方法的更多信息
更新插入
它是模型的 save() 或 update(**kwargs) 方法的代理。如果未设置 pk,将调用 save() 方法。
!!!tip 阅读 models-upsert 中有关 upsert() 方法的更多信息
保存相关
方法会遍历调用该方法的模型的所有关系,并在每个未保存的模型上调用 upsert() 方法。
!!!tip 在 models-save-lated 中阅读有关 save_lated() 方法的更多信息
QuerysetProxy 方法
当直接访问相关的ManyToMany字段以及ReverseForeignKey时,返回相关模型的列表。
但同时它公开了 QuerySet API 的子集,因此您可以直接从父模型过滤、创建、选择相关模型等。
创造
与上面的创建函数完全相同,但允许您从关系的另一端创建相关对象。
!!!tip 要了解有关 QuerysetProxy 的更多信息,请访问 querysetproxy 部分
获取或创建
与上面的 get_or_create 函数完全相同,但允许您从关系的另一端查询或创建相关对象。
!!!tip 要了解有关 QuerysetProxy 的更多信息,请访问 querysetproxy 部分
更新或创建
与上面的 update_or_create 函数完全相同,但允许您从关系的另一端更新或创建相关对象。
!!!tip 要了解有关 QuerysetProxy 的更多信息,请访问 querysetproxy 部分