通常就谜,我們是先建立 Django 服務(wù)纷纫,然后通過 Django 的 models 生成數(shù)據(jù)庫叁扫。然而三妈,有些時候我們需要反向操作,即從現(xiàn)有數(shù)據(jù)庫生成 Django 的 models莫绣。比如畴蒲,我們需要針對當(dāng)前數(shù)據(jù)庫,使用 Django 制作 REST 的接口对室。
1 Django 配置數(shù)據(jù)庫連接參數(shù)
新建 Djano項(xiàng)目模燥、app(假設(shè)名叫 blogapp)咖祭。在 settings.py 中設(shè)置數(shù)據(jù)庫的連接參數(shù),參照 Django 與 MySQL 數(shù)據(jù)庫的連接蔫骂。
2 根據(jù)數(shù)據(jù)庫生成 models
首先么翰,需要用 inspectdb
來生成 models.py
,主要的命令是
$ python manage.py inspectdb
假設(shè)指定 models纠吴,比如 blogapp 下面的 models
$ python manage.py inspectdb > blogapp/models.py
3 models 中的調(diào)整 managed = True
對于自己需要的 models硬鞍,如果需要以后進(jìn)行 CRUD 增刪查改操作,需要在 Meta 中設(shè)置 managed = True
戴已。
class PostsPost(models.Model):
title = models.CharField(max_length=150)
content = models.TextField()
timestamp = models.DateTimeField()
updated = models.DateTimeField()
class Meta:
managed = True
db_table = 'posts_post'
4 migrate 時,使用 --fake-initial
首次數(shù)據(jù)遷移 migrate 時锅减,需要使用 --fake-initial
參數(shù)糖儡,因?yàn)閿?shù)據(jù)庫已經(jīng)存在,不帶 --fake
會報錯且遷移不成功怔匣。
$ python manage.py makemigrations
$ python manage.py migrate --fake-initial
5 測試效果
在 blog/admin.py 中把 models 注冊進(jìn)去握联。
from django.contrib import admin
from .models import PostsPost
admin.site.register(PostsPost)
使用 admin 進(jìn)行增刪查改,并且在 MySQL 中確認(rèn)數(shù)據(jù)庫操作成功每瞒。
6 使用了 --fake
之后金闽,需要修改 models
如果不再是 —fake
而需要真實(shí)改動數(shù)據(jù)庫結(jié)構(gòu),需要
python manage.py migrate --fake core 0003
python manage.py migrate core
How to redo a migration on django 1.8 after using --fake
備注:
最后需要注意:Django 的整體全局 migrate剿骨,會因?yàn)槌霈F(xiàn)沒找到變化的情況代芜。
$ python manage.py migrate
建議還是制定 app 進(jìn)行 migrate
$ python manage.py migrate your_app
參考
官方文檔最新指南:
官方英文文檔:Auto-generate the models
官方文檔中文翻譯:將Django與舊數(shù)據(jù)庫集成
中文的介紹:
已有的數(shù)據(jù)庫集成django orm (Database to Models)
從數(shù)據(jù)庫反向生成django的models
在已有數(shù)據(jù)庫上如何創(chuàng)建Django項(xiàng)目
Django根據(jù)現(xiàn)有數(shù)據(jù)庫建立model
Django Book 一些清理生成的 Models 的建議
關(guān)于Django migrate 的兩個參數(shù)—fake-initial
與 —fake
: