假设Book
表具有两个字段id
,name
。 id
是自动递增的pk。
数据库后端是mysql
在Django中。
book = Book.objects.create(name="Tender Is the Night")
Django如何知道新书的ID。
Django将哪些SQL语句发送给Mysql服务器?
仅插入语句?如果是这样,insert语句是否会返回新创建的书的ID?
答案 0 :(得分:0)
这是MySQL的功能。参见https://dev.mysql.com/doc/refman/8.0/en/example-auto-increment.html
CREATE TABLE animals (
id MEDIUMINT NOT NULL AUTO_INCREMENT,
name CHAR(30) NOT NULL,
PRIMARY KEY (id)
);
INSERT INTO animals (name) VALUES
('dog'),('cat'),('penguin'),
('lax'),('whale'),('ostrich');
SELECT * FROM animals;
没有为
AUTO_INCREMENT
列指定任何值,因此MySQL自动分配了序列号。
Django使用相关的数据库API(在本例中为MySQL)找出最后插入的ID:
您可以使用
AUTO_INCREMENT
SQL函数或LAST_INSERT_ID()
C API函数来检索最近自动生成的mysql_insert_id()
值。这些函数是特定于连接的,因此它们的返回值不受也执行插入操作的另一个连接的影响。
有关详细信息,请参见相关的源代码:https://github.com/django/django/blob/master/django/db/models/base.py#L874
def _do_insert(self, manager, using, fields, update_pk, raw):
"""
Do an INSERT. If update_pk is defined then this method should return
the new pk for the model.
"""
return manager._insert([self], fields=fields, return_id=update_pk,
using=using, raw=raw)