资讯专栏INFORMATION COLUMN

djang data migration

quietin / 774人阅读

摘要:当你第一次用的数据库请求表中不存在的字段时会导致错误。不关心数据库中是否存在未被模型表示的。缺点数据量大的时候,速度相对较慢,表的关系比较复杂的时候可以导入不成功。

djang data migration

在使用django框架开发的过程中,我们不可避免的遇到models层的变更,就涉及到数据库表的变动,django给我提供了一个migration的工具来做这些数据库表的变更。

djang migration

如果不加appname,那么就是指所有包含migrations 目录的app

# 基于当前的model 检测修改,创建迁移策略文件
python manage.py makemigrations 
# 执行迁移动作
python manage.py migrate
migrations失败

有时候如果models改动比较大,migrations会失败,这个时候有两种选择,手工去修改migrations文件,第二种是清除所有migrations,重新migrate

手工修改migrations文件

通过报错信息加上SQL语句找到找到问题,然后具体问题具体分析,是修改数据库里面的数据,还是修改migrations生成的脚本。

python manage.py migrate

python manage.py sqlmigrate  0001

当处理模型修改的时候:

如果模型包含一个未曾在数据库里建立的字段,Django会报出错信息。 当你第一次用Django的数据库API请求表中不存在的字段时会导致错误。

Django不关心数据库表中是否存在未在模型中定义的列。

Django不关心数据库中是否存在未被模型表示的table。

在使用SQLite3数据库时, 因为SQLite3 不支持删除列操作,只有有限地 ALTER TABLE 支持,
所以修改数据库列的操作被新建表然后select into newtable 代替,所以会存在更多问题

参考

http://www.tuicool.com/articles/yM3IVr

NULL to NOT NULL
python manage.py makemigrations
You are trying to add a non-nullable field "college" to majorproperty without a default; we can"t do that (the database needs something to populate existing rows).
Please select a fix:
 1) Provide a one-off default now (will be set on all existing rows)
 2) Quit, and let me add a default in models.py
Select an option: 1
Please enter the default value now, as valid Python
The datetime and django.utils.timezone modules are available, so you can do e.g. timezone.now()
>>> 1

在migrate的时候提示你需要指定一个默认值,用以处理NULL的情况

清除migrations

清除所有app目录/migrations/下除__init__.py 文件之外的py文件

find . -path "*migrations*" -name "*.py" -not -path "*__init__*" -exec rm {} ;
squashmigrations

当migrations越来越多的时候执行 makemigrations 和 migrate 就会越来越慢,可以考虑对其瘦身(减少migrations文件的数量)

python manage.py squashmigrations schools 0002
数据导入导出 数据导出

django 项目提供了一个导出的方法 python manage.py dumpdata, 不指定 appname 时默认为导出所有的app

python manage.py dumpdata [appname] > appname_data.json
数据导入

数据导入,不需要指定 appname

python manage.py loaddata appname_data.json

优点:可以兼容各种支持的数据库,也就是说,以前用的是 SQLite3,可以导出后,用这种方法导入到 MySQL, PostgreSQL等数据库,反过来也可以。

缺点:数据量大的时候,速度相对较慢,表的关系比较复杂的时候可以导入不成功。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/37920.html

相关文章

  • sqlalchemy使用上的小tip

    摘要:地址序列化为灵感来源于多个实例单个实例排除字段仅包括字段关系查询深度默认为增加一些自定义的函数可传递参数的函数像一样使用与相比为什么很多人都认为更好用大概就是因为更方便基本查询已实现示例关系查询其它去掉一些的重复工作以为例通过继承中的就 GitHub地址: https://github.com/honmaple/maple-json sqlalchemy object序列化为json...

    tyheist 评论0 收藏0
  • Flask之扩展flask-migrate

    摘要:一个用来做数据迁移的扩展,一般都是结合使用,在上一篇文章中我也介绍了这个扩展,需要的小伙伴可以看一下,后续我会将更深层的写出来。 flask-migrate一个用来做数据迁移的falsk扩展,一般都是结合flask-sqlalchemy使用,在上一篇文章中我也介绍了这个扩展,需要的小伙伴可以看一下,后续我会将flask-sqlalchemy更深层的写出来。【config.py】 SQL...

    Snailclimb 评论0 收藏0
  • 何成为 QueryPHP 开发者

    摘要:文档开发基于单元测试实现的自动化文档当前文档开发计划功能开发当前计划功能技术债务清偿当前技术债务单元测试尽可能减少当前单元测试成为开发者需要加入我们的组织,如有相关意愿请发送邮件至小牛哥,我们会联系你的。 QueryPHP 非常欢迎各位给我们共同的伟大的作品添砖加瓦,实现为 PHP 社区提供一个好框架的美好愿景。 文档开发.基于单元测试实现的自动化文档 当前文档开发 计划功能.开发...

    bigdevil_s 评论0 收藏0
  • Flask Web Development —— 数据库(下)

    摘要:命令需要注册回调函数来将对象添加到导入列表。创建迁移脚本在,数据库迁移工作由迁移脚本完成。函数实施数据库更改,是迁移的一部分,函数则删除它们。另一方面,自动迁移通过寻找模型定义和数据库当前状态间的不同为和生成代码。 9、数据库在视图函数中的使用 在前面章节描述的数据库操作是可以在视图函数中直接使用的。示例5-5展示的新版本主页实现了用户输入名字并保存到数据库中。 示例5-5. he...

    buildupchao 评论0 收藏0
  • Flask Web Development —— 数据库(下)

    摘要:命令需要注册回调函数来将对象添加到导入列表。创建迁移脚本在,数据库迁移工作由迁移脚本完成。函数实施数据库更改,是迁移的一部分,函数则删除它们。另一方面,自动迁移通过寻找模型定义和数据库当前状态间的不同为和生成代码。 9、数据库在视图函数中的使用 在前面章节描述的数据库操作是可以在视图函数中直接使用的。示例5-5展示的新版本主页实现了用户输入名字并保存到数据库中。 示例5-5. he...

    jone5679 评论0 收藏0

发表评论

0条评论

quietin

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<