Django操作已有数据库的数据
虽然django适合从零开始构建⼀个项⽬,但有时候整合原有的数据库也在所难免,下⾯以django整合我的mysql作说明。mysql数据是我从京东上抓取的数据,数据表名为jd,演⽰如图
下⾯将jd整合到django中,操作如下
1.修改settings.py
root@iZ28b5osxspZ:/home/jd# vim jd/settings.py
...
DATABASES = {
'default': {
'ENGINE': 'django.sql',
#'NAME': os.path.join(BASE_DIR, "jd.sql"),
'NAME':'jd',
'HOST':'127.0.0.1',
'PORT':3306,
'USER':'root',
'PASSWORD':'hehe',
}
}
...
2.针对已有数据库⾃动⽣成新的models
# This is an auto-generated Django model module.
# You'll have to do the following manually to clean this up:
#  * Rearrange models' order
#  * Make sure each model has one field with primary_key=True
#  * Remove `managed = False` lines if you wish to allow Django to create, modify, and delete the table
# Feel free to rename the models, but don't rename db_table values or field names.
#
# You'll have to do the following manually to clean this up:
# Also note: You'll have to insert the output of 'django-admin.py sqlcustom [app_label]'
# into your database.
from__future__import unicode_literals
from django.db import models
class Jd(models.Model):
id = models.IntegerField(primary_key=True)  # AutoField?
category = models.CharField(max_length=64, blank=True)
#  * Make sure each model has one field with primary_key=True
name = models.CharField(max_length=128, blank=True)
price = models.CharField(max_length=64, blank=True)
url = models.CharField(max_length=64, blank=True)
class Meta:
managed = False
db_table = 'jd'
root@iZ28b5osxspZ:/home/jd#
3.导出模型并代替models.py
root@iZ28b5osxspZ:/home/jd# python manage.py inspectdb > models.py
root@iZ28b5osxspZ:/home/jd# ls
jd  main  manage.py  models.py
root@iZ28b5osxspZ:/home/jd# mv models.py main/
4.默认配置下⽣成不可修改/删除的models,修改meta class中的managed=True则告诉django可以对数据库进⾏操作
Operations to perform:
Apply all migrations: admin, contenttypes, auth, sessions
django项目实例
Running migrations:
Applying contenttypes. OK
Applying auth. OK
Applying admin. OK
Applying sessions. OK
root@iZ28b5osxspZ:/home/jd# python manage.py shell
Python 2.7.6 (default, Mar 22 2014, 22:59:56)
Type "copyright", "credits"or"license"for more information.
IPython 1.2.1 -- An enhanced Interactive Python.
-
> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help      -> Python's own help system.
object?  -> Details about 'object', use 'object??'for extra details.
5.是不是真的可以操作原有数据库了呢?进⾏验证即可
root@iZ28b5osxspZ:/home/jd# python manage.py shell
Python 2.7.6 (default, Mar 22 2014, 22:59:56)
Type "copyright", "credits"or"license"for more information.
IPython 1.2.1 -- An enhanced Interactive Python.
-> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help      -> Python's own help system.
object?  -> Details about 'object', use 'object??'for extra details.
In [1]: dels import Jd
In [2]: Jd.objects.all()
Out[2]: [<Jd: 雅克菱正畸保持器清洁⽚ 3g*24⽚>, <Jd: 洁灵中药漱⼝⽔  320ml(清除异味清新⼝⽓)冬青薄荷型>, <Jd: 静佳JPlus ⽻泉三秒钟酷感⼝腔喷雾清新⼝⽓>, <Jd: 雅克菱假⽛清洁⽚60⽚薄荷味⼝⽓清新剂>, <Jd: 澳多-C(Victoria-C) 漱⼝⽔冰蓝超爽⼝味600ml>, <Jd: 保丽净假⽛清洁⽚局部假⽛专⽤30⽚>, <Jd: 李施德林漱⼝⽔500ml*3(天然橙味清凉⼝味冰蓝⼝味)>, <Jd: saky舒客舒克专业清新漱⼝⽔天然鲜橙380ml送120ml去⼝臭不含氟>, <Jd: 保丽净全/半⼝假⽛专⽤假⽛清洁⽚30⽚>, <Jd: 李施德林漱⼝⽔天然橙味250ml*5 防蛀⽛固齿去除⼝臭⼝⽓刺激性⼩>, <Jd: saky舒客舒克漱⼝⽔清凉薄荷380ml送120ml 去⼝臭>, <Jd: 保丽净假⽛全⼝清洁⽚60⽚ 24⽚加送⽛盒⽛刷>, <Jd: 保丽净假⽛护理套装(清洁⽚60⽚)舒适达专业修复⽛膏100g>, <Jd: LION狮王ETIQUETTE清新⼝喷5ml*2⽀清凉薄荷>, <Jd: 皓齿健(Hosjam) 芨效抗敏漱⼝⽔500ml>, <Jd: 好易康⽣物酶漱⼝⽔去除⼝⽓⼝臭⽛龈出⾎⽛周炎杀菌防蛀
薄荷味 250ML>, <Jd: 保丽净假⽛清洁⽚30⽚*2盒>, <Jd: ⾹港版李施德林淡⾹草漱⼝⽔1000ml 除⼝臭清新⼝⽓去⽛渍>, <Jd: 除⼝臭漱  2瓶装⼝⽔液喷剂⼝⽓清新剂⼝喷雾⼝腔溃疡喷雾剂⼝苦⼝⼲>, <Jd: ⽇本狮王(Lion) ETIQUETTE清新⼝喷(清凉薄荷) 5ml 原装进⼝>, '...(remaining elements truncated)...']
Django集成已有的和应⽤:Django最适合于所谓的green-field开发,即从头开始的⼀个项⽬,正如你在⼀块还长着青草的未开垦的⼟地上从零开始建造⼀栋建筑⼀般。
然⽽,尽管Django偏爱从头开始的项⽬,将这个框架和以前遗留的数据库和应⽤相整合仍然是可能的。本章就将介绍⼀些整合的技巧。
与遗留数据库整合
Django的数据库层从代码⽣成SQL schemas—但是对于遗留数据库,你已经拥有SQL schemas,这种情况下你需要为你已经存在的数据库表写模型(由于性能的原因,Django的数据库层不⽀持通过运⾏时⾃省数据库的不⼯作的对象-关系映射,为了使⽤数据库API,你需
数据库表写模型(由于性能的原因,Django的数据库层不⽀持通过运⾏时⾃省数据库的不⼯作的对象-关系映射,为了使⽤数据库API,你需要写模型代码),幸运的是,Django带有通过你的数据库表规划来⽣成模型代码的辅助⼯具该辅助⼯具称为manage.py inspectdb 使⽤inspectdb
The inspectdb⼯具内省检查你的配置⽂件(setting file)指向的数据库,针对你的每⼀个表⽣成⼀个Django model的表现,然后将这些Python model的代码显⽰在的标准输出⾥⾯。
下⾯是⼀个从头开始的针对⼀个典型的遗留数据库的整合过程
通过运⾏django-admin.py startproject mysite (这⾥mysite是你的项⽬的名字)建⽴⼀个Django项⽬。好的,那我们在这个例⼦中就⽤这个mysite作为项⽬的名字。
编辑项⽬中的配置⽂件, mysite/settings.py,告诉Django你的数据库连接参数和数据库名。具体的说,要提供
DATABASE_NAME,DATABASE_ENGINE,DATABASE_USER,DATABASE_PASSWORD,DATABASE_HOST,和DATABASE_PORT 这些配置信息.
通过运⾏pythonmysite/manage.pystartappmyapp(这⾥myapp是你的应⽤的名字)创建⼀个Django应⽤.那么,我们就以myapp做为这个应⽤的名字.
运⾏命令pythonmysite/manage.pyinspectdb.这将在DATABASE_NAME数据库中检查所有的表和打印出为每张表⽣成的model class.看⼀看输出结果想⼀下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)
这样做并不是仅仅因为这些⾏是冗余的,⽽且如果当你的应⽤需要向这些表中增加新记录时,这些⾏会导致某些问题。⽽inspectdb命令并不能检测出⼀个字段是否⾃增长的,因此必要的时候,你必须将
他们修改为AutoField.
每⼀个字段类型,如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。
与认证系统的整合
将Django与其他现有认证系统的⽤户名和密码或者认证⽅法进⾏整合是可以办到的。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。