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机器学习实战之树回归详解
Dec 20 Python
基于Python socket的端口扫描程序实例代码
Feb 09 Python
Python 将pdf转成图片的方法
Apr 23 Python
python实现支付宝当面付(扫码支付)功能
May 30 Python
django.db.utils.ProgrammingError: (1146, u“Table‘’ doesn’t exist”)问题的解决
Jul 13 Python
python正则表达式匹配[]中间为任意字符的实例
Dec 25 Python
python+selenium 定位到元素,无法点击的解决方法
Jan 30 Python
Python程序打包工具py2exe和PyInstaller详解
Jun 28 Python
python过滤中英文标点符号的实例代码
Jul 15 Python
python集合的创建、添加及删除操作示例
Oct 08 Python
基于python实现计算且附带进度条代码实例
Mar 31 Python
Python3.8安装Pygame教程步骤详解
Aug 14 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
ftp类(example.php)
2006/10/09 PHP
PHP 强制下载文件代码
2010/10/24 PHP
关于svn冲突的解决方法
2013/06/21 PHP
php正则表达式学习笔记
2015/11/13 PHP
Zend Framework实现具有基本功能的留言本(附demo源码下载)
2016/03/22 PHP
laravel 框架配置404等异常页面
2019/01/07 PHP
JavaScript 继承的实现
2009/07/09 Javascript
jquery延迟加载外部js实现代码
2013/01/11 Javascript
jQuery阻止同类型事件小结
2013/04/19 Javascript
js获取浏览器基本信息大全
2014/11/27 Javascript
基于jquery实现的自动补全功能
2015/03/12 Javascript
JavaScript实现添加及删除事件的方法小结
2015/08/04 Javascript
动态的9*9乘法表效果的实现代码
2016/05/16 Javascript
Angular2  NgModule 模块详解
2016/10/19 Javascript
jQuery的ajax中使用FormData实现页面无刷新上传功能
2017/01/16 Javascript
微信小程序 基础组件与导航组件详细介绍
2017/02/21 Javascript
从源码看angular/material2 中 dialog模块的实现方法
2017/10/18 Javascript
vue.js 添加 fastclick的支持方法
2018/08/28 Javascript
Vue模拟数据,实现路由进入商品详情页面的示例
2018/08/31 Javascript
微信小程序云开发修改云数据库中的数据方法
2019/05/18 Javascript
微信小程序实现传递多个参数与事件处理
2019/08/12 Javascript
[02:00]最后,我终于出了辉耀
2018/03/27 DOTA
[01:11:48]Fnatic vs IG 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
使用python编写脚本获取手机当前应用apk的信息
2014/07/21 Python
pyqt5 使用label控件实时显示时间的实例
2019/06/14 Python
python线程中的同步问题及解决方法
2019/08/29 Python
Python Flask异步发送邮件实现方法解析
2020/08/01 Python
Python利用socket模块开发简单的端口扫描工具的实现
2021/01/27 Python
中外合拍动画首获奥斯卡提名,“上海出品”《飞奔去月球》能否拿下最终大奖?
2021/03/16 国漫
HTML5中form如何关闭自动完成功能的方法
2018/07/02 HTML / CSS
英国儿童图书网站:Scholastic
2017/03/26 全球购物
兰兰过桥教学反思
2014/02/08 职场文书
2014年助理工程师工作总结
2014/11/14 职场文书
西柏坡导游词
2015/02/05 职场文书
蜗居观后感
2015/06/11 职场文书
python内置模块之上下文管理contextlib
2022/06/14 Python