Django 使用现有数据库生成 models

通常,我们是先建立 Django 服务,然后通过 Django 的 models 生成数据库。然而,有些时候我们需要反向操作,即从现有数据库生成 Django 的 models。比如,我们需要针对当前数据库,使用 Django 制作 REST 的接口。

1 Django 配置数据库连接参数

新建 Djano项目、app(假设名叫 blogapp)。在 settings.py 中设置数据库的连接参数,参照 Django 与 MySQL 数据库的连接。

2 根据数据库生成 models

首先,需要用 inspectdb 来生成 models.py,主要的命令是

$ python manage.py inspectdb

假设指定 models,比如 blogapp 下面的 models

$ python manage.py inspectdb > blogapp/models.py

3 models 中的调整 managed = True

对于自己需要的 models,如果需要以后进行 CRUD 增删查改操作,需要在 Meta 中设置 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

首次数据迁移 migrate 时,需要使用 --fake-initial 参数,因为数据库已经存在,不带 --fake 会报错且迁移不成功。

$ python manage.py makemigrations
$ python manage.py migrate --fake-initial

5 测试效果

在 blog/admin.py 中把 models 注册进去。

from django.contrib import admin
from .models import PostsPost

admin.site.register(PostsPost)

使用 admin 进行增删查改,并且在 MySQL 中确认数据库操作成功。

6 使用了 --fake 之后,需要修改 models

如果不再是 —fake 而需要真实改动数据库结构,需要

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,会因为出现没找到变化的情况。

$ python manage.py migrate

建议还是制定 app 进行 migrate

$ python manage.py migrate your_app

参考

官方文档最新指南:

官方英文文档:Auto-generate the models

官方英文文档:inspectdb

官方英文文档:migrate —fake-initial

官方文档中文翻译:将Django与旧数据库集成

中文的介绍:

已有的数据库集成django orm (Database to Models)

从数据库反向生成django的models

在已有数据库上如何创建Django项目

Django根据现有数据库建立model

Django Book 一些清理生成的 Models 的建议

集成已有的数据库和应用

关于Django migrate 的两个参数—fake-initial—fake

django migration的使用

--fake-initial vs --fake in Django migration?

你可能感兴趣的:(Django 使用现有数据库生成 models)