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高效编程技巧
Jan 07 Python
python基础入门详解(文件输入/输出 内建类型 字典操作使用方法)
Dec 08 Python
Python正则表达式匹配HTML页面编码
Apr 08 Python
Python实现将xml导入至excel
Nov 20 Python
全面分析Python的优点和缺点
Feb 07 Python
Python之批量创建文件的实例讲解
May 10 Python
python的scikit-learn将特征转成one-hot特征的方法
Jul 10 Python
python3学生名片管理v2.0版
Nov 29 Python
python3实现斐波那契数列(4种方法)
Jul 15 Python
Django model update的多种用法介绍
Mar 28 Python
使用Python的datetime库处理时间(RPA流程)
Nov 24 Python
python通过nmap扫描在线设备并尝试AAA登录(实例代码)
Dec 30 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
smarty section简介与用法分析
2008/10/03 PHP
php绘图之在图片上写中文和英文的方法
2015/01/24 PHP
php实现递归抓取网页类实例
2015/04/03 PHP
PHP5.2中PDO的简单使用方法
2016/03/25 PHP
php+mysql开发的最简单在线题库(在线做题系统)完整案例
2019/03/30 PHP
JQuery的ajax基础上的超强GridView展示
2009/09/18 Javascript
jQuery 学习第五课 Ajax 使用说明
2010/05/17 Javascript
jQuery extend 的简单实例
2013/09/18 Javascript
jquery实现在页面加载完毕后获取图片高度或宽度
2014/06/16 Javascript
javascript中定义类的方法汇总
2014/12/28 Javascript
jQuery实现网站添加高亮突出显示效果的方法
2015/06/26 Javascript
浅析nodejs实现Websocket的数据接收与发送
2015/11/19 NodeJs
EasyUI折叠表格层次显示detailview详解及实例
2016/12/28 Javascript
Python psutil模块简单使用实例
2015/04/28 Python
python接口自动化如何封装获取常量的类
2019/12/24 Python
python 实现分组求和与分组累加求和代码
2020/05/18 Python
多重CSS背景动画实现方法示例
2014/04/04 HTML / CSS
CSS3毛玻璃效果(blur)有白边问题的解决方法
2016/11/15 HTML / CSS
HTML5 Canvas 破碎重组的视频特效的示例代码
2019/09/24 HTML / CSS
H5页面适配iPhoneX(就是那么简单)
2019/12/02 HTML / CSS
英国鞋类及配饰零售商:Kurt Geiger
2017/02/04 全球购物
彪马西班牙官网:PUMA西班牙
2019/06/18 全球购物
沙特阿拉伯家用电器和电子产品购物网站:Sheta and Saif
2020/04/03 全球购物
大学生个人总结的自我评价
2013/10/05 职场文书
大学毕业生文采飞扬的自我鉴定
2013/12/03 职场文书
关于人生的感言
2014/01/17 职场文书
生物制药自我鉴定
2014/01/25 职场文书
成品库仓管员岗位职责
2014/04/06 职场文书
《天游峰的扫路人》教学反思
2014/04/25 职场文书
大学班级计划书
2014/04/29 职场文书
细节决定成败演讲稿
2014/05/12 职场文书
模具专业求职信
2014/06/26 职场文书
2015年党员公开承诺书范文
2015/01/22 职场文书
2015年六一儿童节活动总结
2015/02/11 职场文书
个人专业技术总结
2015/03/05 职场文书
纯CSS实现一个简单步骤条的示例代码
2022/07/15 HTML / CSS