Django 迁移是一种自动化的过程,用于更新数据库表结构以及其他数据库对象,以便与 Django 模型保持一致。它使用 Django 的内部 API 来实现,并且可以在不同的数据库引擎之间进行迁移。
Django 迁移的工作原理是:当你在 Django 中创建或修改一个模型时,Django 会生成一个迁移文件(也就是“迁移”)。该文件包含了所有必要的 SQL 命令来将数据库表格升级到最新版本。然后你可以使用 Django 的 migrate 命令来执行这些命令,将数据库升级到最新版本。
# 创建迁移文件 python manage.py makemigrations [app_name] # 执行迁移文件 python manage.py migrate [app_name]
Django 还具有一些高级功能,可帮助你在不同的开发阶段之间实施代码和数据库的变化。例如,你可以使用 Django 的 squashmigrations 功能来将多个迁移合并成一个单独的迁移;或者使用 fakemigrations 功能来将已存在的迁移标记为已执行(而不必真正执行它们)。
Django 可以为你创建迁移。对你的模型进行修改——比如说,添加一个字段和删除一个模型——然后运行 makemigrations
:
$ python manage.py makemigrations
Migrations for "books":
books/migrations/0003_auto.py:
- Alter field author on book
你的模型将被扫描并与当前包含在你的迁移文件中的版本进行比较,然后将写出一组新的迁移。请务必阅读输出,看看 makemigrations
认为你已更改的内容——它并不完美,对于复杂的更改,可能无法检测到你所期望的。
一旦有了新的迁移文件,就应该将它们应用于数据库,以确保它们可以按预期工作:
$ python manage.py migrate
Operations to perform:
Apply all migrations: books
Running migrations:
Rendering model states... DONE
Applying books.0003_auto... OK
一旦应用了迁移,将迁移和模型更改作为一个单一的提交来提交到您的版本控制系统——这样,当其他开发人员(或你的生产服务器)检查代码时,他们将同时获得对你的模型的更改和伴随的迁移。
如果您你给迁移赋予一个有意义的名称而不是生成的名称,则可以使用 makemigrations --name
选项:
$ python manage.py makemigrations --name changed_my_model your_app_label
由于迁移存储在版本控制中,因此你有时会遇到这样的情况:你和另一个开发人员都同时向同一应用提交了迁移,从而导致两次迁移的编号相同。
别担心——这些数字只是给开发者参考的,Django 只在乎每个迁移都有不同的名称。 迁移在文件中指定了它们所依赖的其他哪些迁移——包括同一应用中的早期迁移,所以可以检测到同一应用有两个新的迁移没有排序。
当这种情况发生时,Django 会提示你,并给你一些选项。如果它认为足够安全,它将为你自动线性化两个迁移。如果不安全,你就得自己去修改迁移。
为了方便起见,Django 提供一种方法来测试用户浏览器是否支持cookies。调用视图里 request.session 的 set_test_cookie()...
可以通过继承 AbstractBaseSession 和 SessionStore类来创建基于Django中包含的自定义数据库支持的会话引擎(即 db ...
一旦你定义了你的模型,你需要告诉 Django 你准备 使用 这些模型。你需要修改设置文件中的 INSTALLED_APPS,在这个设置...
Java Swing教程 -Java Swing工具包我们可以使用java.awt.Toolkit与本机工具包系统进行通信。Toolkit类提供了一个静态getDefaultT...
MyBatis-Plus 条件构造器-AbstractWrapperin(R column, Collection? value)in(boolean condition, R column, Collection? value)...
基于 Java 的配置到目前为止,你已经看到如何使用 XML 配置文件来配置 Spring bean。如果你熟悉使用 XML 配置,那么我会说,不需...
sql:query 标签 sql:query标签用来运行SQL SELECT语句,还有就是将结果存储在作用域变量中。属性 sql:query标签有如下属性:...
fmt:setBundle 标签 fmt:setBundle标签用来载入一个资源束,然后将它存储在作用域中已命名的变量或bundle配置变量中。语法格式fm...
x:choose, x:when, x:otherwise 标签 x:choose标签与Java switch语句有相同的功能。switch语句有case语句,而x:choose标签有x:wh...