Django与遗留的数据库整合的方法指南


Posted in Python onJuly 24, 2015

Django的数据库层从Python代码生成SQL schemas—但是对于遗留数据库,你已经拥有SQL schemas. 这种情况,你需要为已经存在的数据表创建model. 为此,Django自带了一个可以通过读取您的数据表结构来生成model的工具. 该辅助工具称为inspectdb,你可以通过执行manage.py inspectdb来调用它.
使用 inspectdb

inspectdb工具自省你配置文件指向的数据库,针对每一个表生成一个Django模型,然后将这些Python模型的代码显示在系统的标准输出里面。

下面是一个从头开始的针对一个典型的遗留数据库的整合过程。 两个前提条件是安装了Django和一个传统数据库。

    通过运行django-admin.py startproject mysite (这里 mysite 是你的项目的名字)建立一个Django项目。 好的,那我们在这个例子中就用这个 mysite 作为项目的名字。

    编辑项目中的配置文件, mysite/settings.py ,告诉Django你的数据库连接参数和数据库名。 具体的说,要提供 DATABASE_NAME , DATABASE_ENGINE , DATABASE_USER , DATABASE_PASSWORD , DATABASE_HOST , 和 DATABASE_PORT 这些配置信息.。 (请注意其中的一些设置是可选的。 更多信息参见第5章)

    通过运行 python mysite/manage.py startapp myapp (这里 myapp 是你的应用的名字)创建一个Django应用。 这里我们使用myapp 做为应用名。

    运行命令 python mysite/manage.py inspectdb。这将检查DATABASE_NAME 数据库中所有的表并打印出为每张表生成的模型类。 看一看输出结果以了解inspectdb能做些什么。

    将标准shell的输出重定向,保存输出到你的应用的 models.py 文件里:

python mysite/manage.py inspectdb > mysite/myapp/models.py

    编辑 mysite/myapp/models.py 文件以清理生成的 models 并且做一些必要的自定义。

清理生成的Models

如你可能会预料到的,数据库自省不是完美的,你需要对产生的模型代码做些许清理。 这里提醒一点关于处理生成 models 的要点:

    数据库的每一个表都会被转化为一个model类 (也就是说,数据库的表和model 类之间是一对一的映射)。 这意味着你需要为多对多连接的表,重构其models 为 ManyToManyField 的对象。

    所生成的每一个model中的每个字段都拥有自己的属性,包括id主键字段。 但是,请注意,如果某个model没有主键的话,那么Django会自动为其增加一个id主键字段。 这样一来,你也许希望移除这样的代码行。

id = models.IntegerField(primary_key=True)

    这样做并不是仅仅因为这些行是冗余的,而且如果当你的应用需要向这些表中增加新记录时,这些行会导致某些问题。

    每一个字段类型,如CharField、DateField, 是通过查找数据库列类型如VARCHAR,DATE来确定的。如果inspectdb无法把某个数据库字段映射到model字段上,它会使用TextField字段进行代替,并且会在所生成model字段后面加入Python注释“该字段类型是猜的”。 对这要当心,如果必要的话,更改字段类型。

    如果你的数据库中的某个字段在Django中找不到合适的对应物,你可以放心的略过它。 Django模型层不要求必须导入你数据库表中的每个列。

    如果数据库中某个列的名字是Python的保留字(比如pass、class或者for等),inspectdb会在每个属性名后附加上_field,并将db_column属性设置为真实的字段名(也就是pass,class或者for等)。

    例如,某张表中包含一个INT类型的列,其列名为for,那么所生成的model将会包含如下所示的一个字段:

for_field = models.IntegerField(db_column='for')

    inspectdb 会在该字段后加注 ‘字段重命名,因为它是一个Python保留字' 。

    如果数据库中某张表引用了其他表(正如大多数数据库系统所做的那样),你需要适当的修改所生成model的顺序,以使得这种引用能够正确映射。 例如,model Book拥有一个针对于model Author的外键,那么后者应该先于前者被定义。如果你想创建一个指向尚未定义的model的关系,那么可以使用包含model名的字符串,而不是model对象本身。

    对于PostgreSQL,MySQL和SQLite数据库系统,inspectdb能够自动检测出主键关系。 也就是说,它会在合适的位置插入primary_key=True。 而对于其他数据库系统,你必须为每一个model中至少一个字段插入这样的语句,因为Django的model要求必须拥有一个primary_key=True的字段。

    外键检测仅对PostgreSQL,还有MySQL表中的某些特定类型生效。 至于其他数据库,外键字段将在假定其为INT列的情况下被自动生成为IntegerField。

Python 相关文章推荐
Python中使用logging模块打印log日志详解
Apr 05 Python
在Python中编写数据库模块的教程
Apr 29 Python
python使用reportlab实现图片转换成pdf的方法
May 22 Python
Windows下使Python2.x版本的解释器与3.x共存的方法
Oct 25 Python
分享Python字符串关键点
Dec 13 Python
python3制作捧腹网段子页爬虫
Feb 12 Python
[原创]pip和pygal的安装实例教程
Dec 07 Python
python traceback捕获并打印异常的方法
Aug 31 Python
python使用opencv实现马赛克效果示例
Sep 28 Python
Pyecharts绘制全球流向图的示例代码
Jan 08 Python
python如何快速拼接字符串
Oct 28 Python
Python Socket编程详解
Apr 25 Python
简介Django中内置的一些中间件
Jul 24 #Python
Python字符串转换成浮点数函数分享
Jul 24 #Python
详解Python的Django框架中的中间件
Jul 24 #Python
浅谈Python的Django框架中的缓存控制
Jul 24 #Python
详解Django缓存处理中Vary头部的使用
Jul 24 #Python
解读Django框架中的低层次缓存API
Jul 24 #Python
Python的Django框架中模板碎片缓存简介
Jul 24 #Python
You might like
什么是MVC,好东西啊
2007/05/03 PHP
开启CURL扩展,让服务器支持PHP curl函数(远程采集)
2011/03/19 PHP
php下载excel无法打开的解决方法
2013/12/24 PHP
ThinkPHP 3.2 版本升级了哪些内容
2015/03/05 PHP
PHPExcel导出2003和2007的excel文档功能示例
2017/01/04 PHP
PHP类与对象后期静态绑定操作实例详解
2018/12/20 PHP
jquery attr 设定src中含有&(宏)符号问题的解决方法
2011/07/26 Javascript
jquery解析xml字符串简单示例
2014/04/11 Javascript
js判断浏览器类型为ie6时不执行
2014/06/15 Javascript
jQuery实现切换页面过渡动画效果
2015/10/29 Javascript
Jquery easyui开启行编辑模式增删改操作
2016/01/14 Javascript
JS数组操作(数组增加、删除、翻转、转字符串、取索引、截取(切片)slice、剪接splice、数组合并)
2016/05/20 Javascript
JSP基于Bootstrap分页显示实例解析
2016/06/12 Javascript
JavaScript组合模式学习要点
2016/08/26 Javascript
javascript实现圣旨卷轴展开效果(代码分享)
2017/03/23 Javascript
jQuery EasyUI结合zTree树形结构制作web页面
2017/09/01 jQuery
Node.js 在本地生成日志文件的方法
2020/02/07 Javascript
JavaScript 引用类型实例详解【数组、对象、严格模式等】
2020/05/13 Javascript
JQuery实现折叠式菜单的详细代码
2020/06/03 jQuery
Python中的闭包详细介绍和实例
2014/11/21 Python
在Python中使用poplib模块收取邮件的教程
2015/04/29 Python
Python基本socket通信控制操作示例
2019/01/30 Python
解决python 3 urllib 没有 urlencode 属性的问题
2019/08/22 Python
Python中BeautifuSoup库的用法使用详解
2019/11/15 Python
DataFrame.to_excel多次写入不同Sheet的实例
2019/12/02 Python
文件上传服务器-jupyter 中python解压及压缩方式
2020/04/22 Python
HTML5+Canvas+CSS3实现齐天大圣孙悟空腾云驾雾效果
2016/04/26 HTML / CSS
美国知名保健品网站:LuckyVitamin(支持中文)
2017/08/09 全球购物
纽约香氛品牌:NEST Fragrance
2018/10/15 全球购物
秋季婚礼证婚词
2014/01/11 职场文书
《月亮湾》教学反思
2014/04/14 职场文书
班级年度安全计划书
2014/05/01 职场文书
迟到检讨书范文
2015/01/27 职场文书
同学聚会通知短信
2015/04/20 职场文书
Java 超详细讲解十大排序算法面试无忧
2022/04/08 Java/Android
详解Vue3使用axios的配置教程
2022/04/29 Vue.js