django ormdjango如何知道新创建记录的自动递增主键

7uhlpewt  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(230)

假设 Book 表有两个字段 id , name . id 是自动递增的主键。数据库后端是mysql
在django。 book = Book.objects.create(name="Tender Is the Night") django怎么知道新书的id。
django向mysql服务器发送了哪些sql语句?
只有insert语句?如果是这样,insert语句是否返回新创建的图书的id?

laximzn5

laximzn51#

这是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 价值观 LAST_INSERT_ID() sql函数或 mysql_insert_id() c api函数。这些函数是特定于连接的,因此它们的返回值不受另一个执行插入的连接的影响。
有关详细信息,请参阅相关源代码: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)

相关问题