gpt4 book ai didi

django - 我可以在主键为 AutoFields 的模型上使用 bulk_create 而不会导致数据不一致吗?

转载 作者:搜寻专家 更新时间:2023-10-30 20:50:24 28 4
gpt4 key购买 nike

来自 bulk_create 的 Django 文档:

If the model’s primary key is an AutoField it does not retrieve and set the primary key attribute, as save() does, unless the database backend supports it (currently PostgreSQL).

好吧,我没有使用 Postgres。

我是否理解,如果我的模型的主键是 AutoField,那么 bulk_create 将向数据库中插入带有空主键列的行?我想在表中有没有主键值的行是解决问题的直接方法,因为它打破了每行必须有一个主键集并且没有两行可能具有相同主键的不变性,对吧?

当我知道在 bulk_create 之前表为空时,我可以通过像这样手动设置主键来解决这个问题吗?

Person.objects.bulk_create([
Person(name='John', surname='Doe', pk=1),
Person(name='Mary', surname='Sue', pk=2)
])

进一步插入对象不会产生问题吗?例如,如果在上述声明之后我这样做:

Person.objects.create(name='Donald', surname='Duck')

唐老鸭的主键会被正确设置为3吗?还是会被错误地设置为 1

我可以强制将新对象的主键计数器设置为任意值(例如,在本例中为“3”)吗?

如果我将主键设置为正确的值并为使用 bulk_create 插入的行手动添加正确的主键值 – 我是否能够使用 bulk_create 而不会危及数据库中的表一致性?

最佳答案

您的数据库行将始终具有一个主键值。即使 Django 愿意,也无法违反该约束。

当 Django 执行批量创建时,如果您没有显式设置主键,则主键由数据库生成。要在模型实例上设置新的主键值,Django 需要一种方法将新创建的主键映射到模型实例。目前,只有 Postgres 支持批量插入。如果您在不同的数据库上执行批量创建,模型实例将没有主键集,但数据库中的行将有一个。

如果您需要知道在其他数据库上批量创建的对象的主键值,您需要在保存它们之前显式设置该值。根据您的数据库,自动递增主键可能会或可能不会考虑插入的值。如果不考虑它们,您可以使用 sqlsequencereset管理命令以生成将重置序列的 SQL。

关于django - 我可以在主键为 AutoFields 的模型上使用 bulk_create 而不会导致数据不一致吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45516502/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com