首页 > 代码库 > 2.3、django项目对数据库的操作

2.3、django项目对数据库的操作

在讲django项目对数据库操作之前先看看MyOSS/MyOSS的几个文件吧。

/MyOSS

…__init__py #在python里,不管是class,还是django里的project和app都一个这个的文件,表示初始化该类或者模块

…settings.py #Django项目主要的配置文件,比如数据库引擎,数据库配置,语言,字符编码,支持的调试模式,时区,已经加载的模块,静态文件目录,根目录的URL配置等等。。

…models.py #Django项目数据库映射文件。

…urls.py #Django网页路径配置文件。

…wsgi.py #运行测试web环境,实际生产环境可改成nginx或者apache

2.3.1、文件代码参考:

Settings.py

需要成功安装MySQLdb

 

Models.py

测试用的是OSS_SanMao.oss_daka_stat表,数据模型可根据原有表修改或者自动生成。

 

Urls.py

 

Views.py

 

2.3.2、ORM(对象关系映射)

2.3.2.1、Django里也直接可以使用原生的SQL语句:

如:for p in usermember.objects.raw(‘select * from user_member’):

                   Print(p)

打印出来的是user_member中所有用户的信息。

简单的说,把要执行的SQL放在raw()里就可以了。

更详细的请参考:https://docs.djangoproject.com/en/1.5/topics/db/sql/

2.3.2.2、为什么使用ORM

Django和其他大多数web框架一样,依赖于数据访问层,可以将底层的关系数据库(如MySQL)和Python的面向对象特质联系起来。有以下优点:

ü  封装有用的方法:

Django的模型对象是定义一组变量,而变量通常是对应的是数据库的列。你可以定义只读的变量或属性组合;ORM允许重写内置的数据库修改方法,例如保存和删除对象,就可以在数据被保存到数据库之前轻易地对它进行任何操作。

ü  安全性:

如2.3.2.1,使用原始SQL语句进行查询,可能会产生不合格的或是保护性很差的查询字符串所导致的问题,例如SQL注入等;但是使用ORM后就不需要自己执行SQL查询,只需要使用ORM提供的智能化引入和转义输入变量的核心机制。

2.3.2.3、使用ORM

比如定义了一个module.py

class book(models.Model):

    blog = models.ForeignKey(Blog)

    headline = models.CharField(max_length=255)

    body_text = models.TextField()

    pub_date = models.DateField()   

    authors = models.ManyToManyField(Author)

    n_comments = models.IntegerField()    

    rating = models.IntegerField()

    def __unicode__(self):

        return self.headline

下面简单介绍几个ORM对比SQL的例子

ü  select:

查找表book中所有数据

book.objects.all()等价于

SELECT * FROM book;

 

查找book表中所有数据并按authors排序

book.objects.order_by(‘authors’)等价于

SELECT * FROM book ORDER BY ‘authors’;

查找book表中pub_date=’2013-06-08’的所有数据

book.objects.filter(pub_date=’2013-06-08’)等价于

SELECT * FROM book WHERE pub_date=’2013-06-08’

 

查找book表中作者名字包含‘test’的所有数据

Book.objects.get(authors_ _contains=’test’)

SELECT * FROM book WHERE authors LIKE ‘test’

 

All:返回一个包含模式里所有数据库记录

Filter:返回一个包含符合指定条件的模型记录

Exclude:和filter相反

Get:获取单个符合条件的记录

更多请参考文档:https://docs.djangoproject.com/en/1.5/topics/db/queries/