使用manage.py创建和更新数据库
查询语法的介绍(Manager和QuerySet)
一,使用manage.py创建和更新数据库
1,syncdb命令
python manage.py syncdb
syncdb是最常用的命令,它是保证所有模型在数据库中都有对应的表,而不是对这个数据库进行一次更新。在必要时候,syncdb会根据模型创建新的表,但对于以及存在的表,该命令不会去进行更改。
2,manage.py参数列表
manage.py函数 |
描述 |
syncdb |
创建所有应用所需的数据表 |
sql |
显示CREATETABLE调用 |
sqlall |
如同上面的sql一样,从sql文件中初始化数据载入语句 |
sqlindexs |
显示对主键创建索引的调用 |
sqlclear |
显示DROP TABLE的调用 |
sqlcustom |
显示指定.sql文件里的自定义SQL语句 |
loaddata |
载入初始数据 |
dumpdata |
把原有的数据库里的数据输出伟JSON,XML等格式 |
sql、sqlall、sql、sqlindexs、sqlclear、sqlcustom不更新数据库,只打印SQL语句以作检验之用。
二,查询语法
查询由模式生成的数据库需要使用两个类:Manager和QuerySet。
1,Manager对象附在模型类里,如果没有特指定,每个模型类都会有一个objects属性,它构成了这个模型在数据库所有基本查询。
Manager的几个常用方法:
all:返回一个包含模式里所有数据库记录的QuerySet;
filter:返回一个包含符合指定条件的模型记录的QuerySet;
exclude:和filter相反,查找不符合条件的那些记录。
get:获取单个符合条件的记录(没有找到或者又超过一个结果都会抛出异常)
2,将QuerySet作为数据库查询
QuerySet接受动态的关键字参数,然后转换称合适的SQL语句在数据库上执行。
例子:
from myproject.myapp.models import Book books_about_trees = Book.objects.filter(title__contains=”Tree”)
解释:Book.objects.filter是一个Manger方法,它返回QuerySet对象;
title__contains=”Tree”是标题包含“Tree”。(gt:大于; gte:大于等于; in:成员测试)
所以这里要求Book的默认manager返回所有标题里含有“Tree”的书,并把返回结果QuerySet存放在一个变量里。这里的QuerySet代表的SQL查询如下:
SELECT * FROM myapp_book WHERE title LIKE “%Tree%”;
3,组合QuerySet查询
列子:
from myproject.myapp.models import Person doe_family = Person.objects.filter(last=”Doe”) john_does = doe_family.filter(first=”John”) john_quincy_does=john_does.filter(middle=”Quincy”)
分析:上面的语句是一步一步缩小结果,开始过滤所有Person对象last name 为“Doe”的人,返回一个包含“Doe”的QuerySet对象赋给doe_family,然后在doe_family中过滤出first name 为“John”的对象,并赋值给john_does,最后在john_does过滤出middle name为Quincy的对象。
也可以直接写成:
Person.objects.filter(last=”Doe”).filter(first=”John”).filter(middle=”Quincy”)
4,查询结果排序
(1)order_by():改变QuerySet默认的排序
例子:
from myproject.myapp.models import Person all_sorted_first = Person.objects.all().order_by('first')
分析:返回的数据集按first name(名字) 排序。
all_sorted_first_five = Person.objects.order_by('first')[:5]
分析:返回按名字查找的前五个人
(2)倒序:在指定的字符串前加“-”就能实现倒序排列。
例如:order_by('-last')
5,用Q和~Q组合查询关键字
QuerySet可以通过一个叫Q的关键字参数封装类进一步参数化,允许使用更复杂的逻辑查询。其结果Q对象可以作为filter或exclude方法的关键字参数。
例子:
from myproject.myapp.models import Person from django.db.models import Q specific_does = Person.objects.filter(last=”Doe”).exclude( Q(first=”John”) | Q(middle = “Quincy”) )
~Q的例子:
Person.objects.filter(Q(last= “Doe”) | (Q(last=”Smith”)&Q(first=”John”)&~Q(middle_startwith=”W')) )
说明:获取所有姓Doe,名伟John Smith,但不是叫John W.Smith的人。
6,使用Extra调整SQL
用extra可以修复QuerySet生成的原始SQL的各个部分,它接受四个关键字参数。如下:
extra参数 | 描述 |
select |
修改select语句 |
where |
提供额外的where子句 |
tables |
提供额外的表 |
params |
安全的替换动态参数 |
eg:
#select first,last,age(age>18) As is_adult FROM myapp_person; the_folks = Person.objects.all().extra(select={'is_adult':”age>18”}) for person in the_folks: if person.is_adult: print “%s %s is an adult because they are %d year old.” % (persion.first,person.last,person.age)
三,利用Django没有提供的SQL特性
1,定义模式(schema)和定制inital SQL
(1)inital SQL:当运行manage.py和SQL相关命令时候,在应用程序里的sql子目录并以.sql结尾 的文件会被自动执行。所以通过使用initial SQL,可以把模式定义命令存放在Django项目里,并当使 用Django工具创建或者重新创建数据库的,它们一定能够会被包括进来。
下面这些功能可以通过这个特性来完成:
视图
触发器和级联
自定义函数和数据类型
(2)fixtures:载入和导出数据
fixtures是保存在纯文本文件里面数据库数据集合的名字,通常指的不是原始的SQL dump,而是一种数据库无关的表现形式,例如XML,YAML,或者是JSON。
fixtures最常见的用法是数据库新建的时或重建的时候,作为初始数据加载进来,例如用来给用户输入的数据分类用的“预装”的数据表,或在开发期间载入的测试数据。