098~100:ORM迁移
ORM模型迁移
迁移命令:
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
中所有的迁移文件。
4、sqlmigrate:查看某个迁移文件在映射到数据库中的时候,转换的SQL
语句。
migrations中的迁移版本和数据库中的迁移版本对不上怎么办?
- 找到哪里不一致,然后使用
python manage.py --fake [版本名字]
,将这个版本标记为已经映射。 - 删除指定
app
下migrations
和数据库表django_migrations
中和这个app
相关的版本号,然后将模型中的字段和数据库中的字段保持一致,再使用命令python manage.py makemigrations
重新生成一个初始化的迁移脚本,之后再使用命令python manage.py makemigrations --fake-initial
来将这个初始化的迁移脚本标记为已经映射。以后再修改就没有问题了。
更多关于迁移脚本的。请查看官方文档:https://docs.djangoproject.com/en/2.0/topics/migrations/
根据已有的表自动生成模型:
在实际开发中,有些时候可能数据库已经存在了。如果我们用Django
来开发一个网站,读取的是之前已经存在的数据库中的数据。那么该如何将模型与数据库中的表映射呢?根据旧的数据库生成对应的ORM
模型,需要以下几个步骤:
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
,就会将表转换为模型后的代码,显示在终端:
from django.db import modelsclass ArticleArticle(models.Model):title = models.CharField(max_length=100)content = models.TextField(blank=True, null=True)create_time = models.DateTimeField(blank=True, null=True)author = models.ForeignKey('FrontUserFrontuser', models.DO_NOTHING, blank=True, null=True)class Meta:managed = Falsedb_table = 'article_article'class ArticleArticleTags(models.Model):article = models.ForeignKey(ArticleArticle, models.DO_NOTHING)tag = models.ForeignKey('ArticleTag', models.DO_NOTHING)class Meta:managed = Falsedb_table = 'article_article_tags'unique_together = (('article', 'tag'),)class ArticleTag(models.Model):name = models.CharField(max_length=100)class Meta:managed = Falsedb_table = 'article_tag'class FrontUserFrontuser(models.Model):username = models.CharField(max_length=100)telephone = models.CharField(max_length=11)class Meta:managed = Falsedb_table = 'front_user_frontuser'
以上代码只是显示在终端。如果想要保存到文件中。那么可以使用>
重定向输出到指定的文件。比如让他输出到models.py
文件中。示例命令如下:
python manage.py inspectdb > models.py
以上的命令,只能在终端执行,不能在pycharm->Tools->Run manage.py Task...
中使用。如果只是想要转换一个表为模型。那么可以指定表的名字。示例命令如下:
python manage.py inspectdb article_article > models.py
2、修正模型:新生成的ORM
模型有些地方可能不太适合使用。比如模型的名字,表之间的关系等等。那么以下选项还需要重新配置一下:
- 模型名:自动生成的模型,是根据表的名字生成的,可能不是你想要的。这时候模型的名字你可以改成任何你想要的。
- 模型所属app:根据自己的需要,将相应的模型放在对应的app中。放在同一个app中也是没有任何问题的。只是不方便管理。
- 模型外键引用:将所有使用
ForeignKey
的地方,模型引用都改成字符串。这样不会产生模型顺序的问题。另外,如果引用的模型已经移动到其他的app中了,那么还要加上这个app的前缀。 - 让Django管理模型:将
Meta
下的managed=False
删掉,如果保留这个,那么以后这个模型有任何的修改,使用migrate
都不会映射到数据库中。 当有多对多的时候,应该也要修正模型。将中间表注视了,然后使用
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)# 使用ManyToManyField模型到表,生成的中间表的规则是:article_tags# 但现在已经存在的表的名字叫做:article_tag# 可以使用db_table,指定中间表的名字tags = models.ManyToManyField("Tag",db_table='article_tag')class Meta:db_table = 'article'
- 表名:切记不要修改表的名字。不然映射到数据库中,会发生找不到对应表的错误。
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
中的核心模型映射到数据库中。
转载于:https://www.cnblogs.com/zheng-weimin/p/10311847.html
098~100:ORM迁移相关推荐
- flask-sqlalchemy + flask-migrate orm迁移数据库
一.flask-sqlalchemy 数据库操控模型 1.基础用法增删改查 (1)建立模型文件,learn_sql.py(名字可以随便起),直接运行改文件可在数据库中创建下student表 from ...
- 常用的100个PHP类库资源和技巧
收集整理一些常用的PHP类库, 资源以及技巧. 以便在工作中迅速的查找所需,本文主要和大家分享常用的100个PHP 类库资源和技巧,希望能帮助到大家. PHP相关的有参考价值的社区,博客,网站,文章, ...
- 全自动迁移数据库的实现 (Fluent NHibernate, Entity Framework Core)
在开发涉及到数据库的程序时,常会遇到一开始设计的结构不能满足需求需要再添加新字段或新表的情况,这时就需要进行数据库迁移. 实现数据库迁移有很多种办法,从手动管理各个版本的ddl脚本,到实现自己的mig ...
- 考拉海购全面云原生迁移之路
今年 8 月底,入驻"阿里动物园"一周年的考拉海购首次宣布战略升级,在现有的跨境业务基础上,将重点从以"货"为中心变成以"人"为中心,全面发 ...
- mysql数据迁移到es_实战ES跨版本数据迁移
描述:由于某种原因,我们现有机房需要关停,并且没有新的机房环境,只能使用阿里云Elasticsearch,而我们之前的ES版本比较老,阿里云Elasticsearch版本目前为6.3.2,版本跨度比较 ...
- mysql云上迁移_自建mysql 迁移到云上-问答-阿里云开发者社区-阿里云
详细解答可以参考官方帮助文档 使用 数据传输服务 DTS 可以将本地 MySQL 实例的数据迁移到 RDS for MySQL 实例.数据传输服务 DTS (以下简称 DTS) 提供的增量数据同步功能 ...
- mysql rds 迁移_数据库迁移:如何将数据库从本地MySQL迁移到服务器RDS上?
使用 数据传输服务 DTS 可以将本地 MySQL 实例的数据迁移到 RDS for MySQL 实例.数据传输服务 DTS (以下简称 DTS) 提供的增量数据同步功能,可以实现在本地应用不停服的情 ...
- 【ORM框架】go语言ORM框架 - gorm快速入门
文章目录 前言 一.正确看待orm 1.什么是orm 2.常用的orm 3.orm的优缺点 4.如何正确看待orm和sql之间的关系 二.gorm入门 前言 Gorm 是 Golang 的一个 orm ...
- beego orm学习
1.数据库 (1)RegisterDriver()注册数据库类型 支持以下三种类型: // For version 1.6 orm.DRMySQL orm.DRSqlite orm.DRPostgre ...
最新文章
- python花萼长度表_Python 数据分析答疑 5:Pandas入门
- [原创]Devexpress XtraReports 系列 10 创建标签报表
- LJL-Solution-vss2005在项目中连接不上 解决方案
- 014_TimePicker时间选择器
- VirtualBox使用技巧:关于undo差分盘与端口映射
- QT乱码总结6.编码测试和总结一
- android 输出字节数组,Android蓝牙通信字节数组的数据类型转换 求教!
- python里的shell是什么_Python与shell的3种交互方式介绍
- 晨哥真有料丨一定要在一个月内让她爱上你!
- 几篇关于Cecil混淆程序集的文章
- fir.im Weekly - 2016 开年技术干货分享
- 前端组件化开发实践总结
- android x86_646,雷电模拟器4.0x86_64位版本即android 7.1 xposed安装
- latex 中手写l的输入方法
- python3数据处理(一)-- 解析XML,Excle文件
- 跨境电商运营如何做好推特广告
- roll() java_java.util.Calendar.roll(int field,int amount)方法实例
- 诗经 - 小雅 - 杕杜
- 机器学习算法系列(18):方差偏差权衡(Bias-Variance Tradeoff)
- 优酷视频什么是登录保护?