假设 Book 表有两个字段 id , name . id 是自动递增的主键。数据库后端是mysql 在django。 book = Book.objects.create(name="Tender Is the Night") django怎么知道新书的id。 django向mysql服务器发送了哪些sql语句? 只有insert语句?如果是这样,insert语句是否返回新创建的图书的id?
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;
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)
1条答案
按热度按时间laximzn51#
这是mysql的一个特性。看到了吗https://dev.mysql.com/doc/refman/8.0/en/example-auto-increment.html
没有为指定值
AUTO_INCREMENT
列,所以mysql会自动分配序列号。django使用相关的数据库api(本例中为mysql)查找最后插入的id:
您可以检索最近自动生成的
AUTO_INCREMENT
价值观LAST_INSERT_ID()
sql函数或mysql_insert_id()
c api函数。这些函数是特定于连接的,因此它们的返回值不受另一个执行插入的连接的影响。有关详细信息,请参阅相关源代码:https://github.com/django/django/blob/master/django/db/models/base.py#l874