Skip to content

将数据插入数据库

以下方法允许您将数据插入数据库。

  • 创建(**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)

另一种方法是模型的拆分创建和持久化。

1
2
malibu = Album(name="Malibu")
await malibu.save()

Tip

获取或创建

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 部分