
## 遷移命令
1.makemigrations:將模型生成遷移腳本。模型所在的app,必須放在settings.py中的INSTALLED_APPS中。這個命令有以下幾個常用選項:
- app_label:后面可以跟一個或者多個app,那么就只會針對這幾個app生成遷移腳本。
如果沒有任何的app_label,那么會檢查INSTALLED_APPS中所有的app下的模型,針對每一個app都生成響應的遷移腳本。
- --name:給這個遷移腳本指定一個名字。
- --empty:生成一個空的遷移腳本。如果你想寫自己的遷移腳本,可以使用這個命令來實現一個空的文件,
然后自己再在文件中寫遷移腳本。
2.migrate:將新生成的遷移腳本。映射到數據庫中。創建新的表或者修改表的結構。以下一些常用的選項:
- app_label:將某個app下的遷移腳本映射到數據庫中。如果沒有指定,那么會將所有在INSTALLED_APPS中的app下的模型都映射到數據庫中。
- app_label migrationname:將某個app下指定名字的migration文件映射到數據庫中。
- --fake:可以將指定的遷移腳本名字添加到數據庫中。但是并不會把遷移腳本轉換為SQL語句,修改數據庫中的表。
- --fake-initial:將第一次生成的遷移文件版本號記錄在數據庫中。但并不會真正的執行遷移腳本。
3.showmigrations:查看某個app下的遷移文件。如果后面沒有app,那么將查看INSTALLED_APPS中所有的遷移文件。
```
python manage.py showmigrations [app名字]
```
4.sqlmigrate:查看某個遷移文件在映射到數據庫中的時候,轉換的SQL語句
```
python manage.py sqlmigrate book 0001_initial
```
### migrations中的遷移版本和數據庫中的遷移版本對不上怎么辦?
1.找到哪里不一致,然后使用python manage.py --fake [版本名字],將這個版本標記為已經映射。
2.刪除指定app下migrations和數據庫表django_migrations中和這個app相關的版本號,然后將模型中的字段和數據庫中的字段保持一致,再使用命令python manage.py makemigrations重新生成一個初始化的遷移腳本,之后再使用命令python manage.py makemigrations --fake-initial來將這個初始化的遷移腳本標記為已經映射。以后再修改就沒有問題了。
### 根據已有的表自動生成模型
在實際開發中,有些時候可能數據庫已經存在了。如果我們用Django來開發一個網站,讀取的是之前已經存在的數據庫中的數據。那么該如何將模型與數據庫中的表映射呢?根據舊的數據庫生成對應的ORM模型,需要以下幾個步驟:
1.Django給我們提供了一個inspectdb的命令,可以非常方便的將已經存在的表,自動的生成模型。想要使用inspectdb自動將表生成模型。首先需要在settings.py中配置好數據庫相關信息。不然就找不到數據庫。
```
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': "migrations_demo",
'HOST': '127.0.0.1',
'PORT': '3306',
'USER': 'root',
'PASSWORD': 'root'
}
}
python manage.py inspectdb > models.py
```
2.修正模型:新生成的ORM模型有些地方可能不太適合使用。比如模型的名字,表之間的關系等等
- 2.1 模型名:自動生成的模型,是根據表的名字生成的,可能不是你想要的。這時候模型的名字你可以改成任何你想要的。
- 2.2 模型所屬app:根據自己的需要,將相應的模型放在對應的app中。放在同一個app中也是沒有任何問題的。只是不方便管理。
- 2.3 模型外鍵引用:將所有使用ForeignKey的地方,模型引用都改成字符串。這樣不會產生模型順序的問題。另外,如果引用的模型已經移動到其他的app中了,那么還要加上這個app的前綴。
- 2.4 讓Django管理模型:將Meta下的managed=False刪掉,如果保留這個,那么以后這個模型有任何的修改,使用migrate都不會映射到數據庫中。
- 2.5 當有多對多的時候,應該也要修正模型。將中間表注視了,然后使用ManyToManyField來實現多對多。并且,使用ManyToManyField生成的中間表的名字可能和數據庫中那個中間表的名字不一致,這時候肯定就不能正常連接了。那么可以通過db_table來指定中間表的名字。
```
class Article(models.Model):
title = models.CharField(max_length=100, blank=True, null=True)
content = models.TextField(blank=True, null=True)
author = models.ForeignKey('front.User', models.SET_NULL, blank=True, null=True)
tags = models.ManyToManyField("Tag",db_table='article_tag')
class Meta:
db_table = 'article'
```
- 2.6 表名:切記不要修改表的名字。不然映射到數據庫中,會發生找不到對應表的錯誤
3 執行命令python manage.py makemigrations生成初始化的遷移腳本。方便后面通過ORM來管理表。這時候還需要執行命令python manage.py migrate --fake-initial,因為如果不使用--fake-initial,那么會將遷移腳本會映射到數據庫中。這時候遷移腳本會新創建表,而這個表之前是已經存在了的,所以肯定會報錯。此時我們只要將這個0001-initial的狀態修改為已經映射,而不真正執行映射,下次再migrate的時候,就會忽略他。
4 將Django的核心表映射到數據庫中:Django中還有一些核心的表也是需要創建的。不然有些功能是用不了的。比如auth相關表。如果這個數據庫之前就是使用Django開發的,那么這些表就已經存在了。可以不用管了。如果之前這個數據庫不是使用Django開發的,那么應該使用migrate命令將Django中的核心模型映射到數據庫中。
- 空白目錄
- 1-Django前導知識
- 1-1-虛擬環境
- 1-2-Django框架介紹與環境搭建
- 2-URL與視圖
- 2-1-URL與視圖
- 3-模板
- 3-1-模板介紹
- 3-2-模板變量
- 3-3-常用標簽
- 3-4-模板常用過濾器
- 3-5-模板結構優化
- 3-6-加載靜態文件
- 4-數據庫
- 4-1-操作數據庫
- 4-2-圖書管理系統
- 4-3-ORM模型介紹
- 4-4-ORM模型的增刪改查
- 4-5-模型常用屬性
- 4-6-外鍵和表
- 4-7-查詢操作
- 4-8-QuerySet的方法
- 4-9-ORM模型練習
- 4-10-ORM模型遷移
- 5-視圖高級
- 1-Django限制請求method
- 2-頁面重定向
- 3-HttpRequest對象
- 4-HttpResponse對象
- 5-類視圖
- 6-錯誤處理
- 6-表單
- 1-用表單驗證數據
- 2-ModelForm
- 3-文件上傳
- 7-session和cookie
- 1-session和cookie
- 8-memcached
- 1-memcached
- 9-阿里云部署
- 阿里云部署