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/