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网络编程实例简析
Sep 26 Python
Python合并字典键值并去除重复元素的实例
Dec 18 Python
python 生成器生成杨辉三角的方法(必看)
Apr 10 Python
Python学习教程之常用的内置函数大全
Jul 14 Python
Python实现加载及解析properties配置文件的方法
Mar 29 Python
python爬虫之urllib3的使用示例
Jul 09 Python
Python使用爬虫抓取美女图片并保存到本地的方法【测试可用】
Aug 30 Python
Python中is和==的区别详解
Nov 15 Python
Python Threading 线程/互斥锁/死锁/GIL锁
Jul 21 Python
Python面向对象封装操作案例详解
Dec 31 Python
python3用PyPDF2解析pdf文件,用正则匹配数据方式
May 12 Python
Python的三个重要函数详解
Jan 18 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
修改Zend引擎实现PHP源码加密的原理及实践
2008/04/14 PHP
使用php记录用户通过搜索引擎进网站的关键词
2014/02/13 PHP
用php来限制每个ip每天浏览页面数量的实现思路
2015/02/24 PHP
PHP+MYSQL实现用户的增删改查
2015/03/24 PHP
php自定义分页类完整实例
2015/12/25 PHP
javascript之可拖动的iframe效果代码
2008/08/01 Javascript
设为首页和收藏的Javascript代码(亲测兼容IE,Firefox,chrome等浏览器)
2013/11/18 Javascript
Jquery 获取指定标签的对象及属性的设置与移除
2014/05/29 Javascript
简单实现nodejs上传功能
2017/01/14 NodeJs
利用Vue.js实现checkbox的全选反选效果
2017/01/18 Javascript
Nodejs搭建wss服务器教程
2017/05/24 NodeJs
微信小程序中进行地图导航功能的实现方法
2018/06/29 Javascript
elementUI select组件使用及注意事项详解
2019/05/29 Javascript
vue+element 模态框表格形式的可编辑表单实现
2019/06/07 Javascript
微信小程序设置滚动条过程详解
2019/07/25 Javascript
微信小程序实现页面跳转传递参数(实体,对象)
2019/08/12 Javascript
解决Vue动态加载本地图片问题
2019/10/09 Javascript
浅谈vue中组件绑定事件时是否加.native
2019/11/09 Javascript
[54:28]EG vs OG 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/18 DOTA
python获得一个月有多少天的方法
2015/06/04 Python
Python从MP3文件获取id3的方法
2015/06/15 Python
Python中的sort()方法使用基础教程
2017/01/08 Python
Python 保持登录状态进行接口测试的方法示例
2019/08/06 Python
Python通过getattr函数获取对象的属性值
2020/10/16 Python
Python环境搭建过程从安装到Hello World
2021/02/05 Python
AE美国鹰日本官方网站: American Eagle Outfitters
2016/12/10 全球购物
基督教卡片、励志礼品、家居装饰等:DaySpring
2018/10/12 全球购物
Java中有几种方法可以实现一个线程?用什么关键字修饰同步方法?stop()和suspend()方法为何不推荐使用?
2015/08/04 面试题
机械设计制造专业个人求职信
2013/09/25 职场文书
抽奖活动主持词
2014/03/31 职场文书
五水共治一句话承诺
2014/05/30 职场文书
小学感恩节活动总结
2015/03/24 职场文书
教师节倡议书2015
2015/04/27 职场文书
信访维稳承诺书
2015/05/04 职场文书
硕士论文致谢范文
2015/05/14 职场文书
结婚十年感言
2015/07/31 职场文书