Django是一款優秀的web框架,有着自己的ORM數據庫模型。在項目中一直使用django數據庫,寫一篇文章專門記錄一下數據庫操作。略寫django工程創建過程,詳寫查詢過程。可以和sqlalchemy對比來看,會發現有很多相同的地方,例如外鍵,外鍵關聯關系等。上一篇sqlalchemy查詢文章
目錄:
1.Django環境搭建
2.數據庫建表
3.寫入數據
4.查詢語句
Django環境搭建
1.安裝django
pip install django
2.創建工程
django.admin project myself
3.創建app
python manage.py create sql_train
4.設置setting文件
將應用sql_train加入到app中
修改數據庫連接方式
將默認的sqlite3數據庫修改成mysql數據庫
如果沒有安裝過mysql數據庫,先安裝mysql,然后安裝mysqldb驅動
添加url映射
2 創建表結構
from __future__ import unicode_literals from django.db import models class Student(models.Model): id = models.IntegerField(primary_key=True) name = models.CharField(max_length=20) class Family(models.Model): id = models.IntegerField(primary_key=True) member = models.CharField(max_length=20) stu_id = models.ForeignKey(Student,related_name='student') class House(models.Model): id = models.IntegerField(primary_key=True) location = models.CharField(max_length=100) family_id = models.ForeignKey(Family,related_name='family') class Cars(models.Model): id = models.IntegerField(primary_key=True) name = models.CharField(max_length=100) Family = models.ForeignKey(Family,related_name='family_to_car')
表結構:
Student是主表
Family是從表,有一個外鍵stu_id連接到Student
House是Family的從表 有一個外鍵family_id連接到Family
Cars是Family的從表,有一個外鍵Family連接到Family
在應用sql_train中的models.py中創建四張表結構,分別是:Student,Family,House,Cars。使用如下命令將表結構創建在mysql數據庫中
python manage.py migrate
寫入數據
#coding:utf-8
from django.shortcuts import render
from django.http import HttpResponse
from models import Student,Family,House,Cars
from django.db import models
from django.db.models import Q
def sql(request):
create_value()
#select_compex()
return HttpResponse('hello')
def create_value(): # Student.objects.create(id=1,name='悟空') # Student.objects.create(id=2,name='貝吉塔') # Student.objects.create(id=3,name='比克') # Student.objects.create(id=4,name='天津飯') # Student.objects.create(id=6,name='庫林') # Student.objects.create(id=7,name='18號') # Student.objects.create(id=8,name='餃子') # Family.objects.create(id=1,member=4,stu_id=Student.objects.get(id=1)) # Family.objects.create(id=2,member=6,stu_id=Student.objects.get(id=2)) # Family.objects.create(id=3,member=9,stu_id=Student.objects.get(id=3)) # Family.objects.create(id=4,member=5,stu_id=Student.objects.get(id=4)) # House.objects.create(id=1,location='地球',family_id=Family.objects.get(id=1)) # House.objects.create(id=2,location='貝吉塔星',family_id=Family.objects.get(id=2)) # House.objects.create(id=3,location='那美克星',family_id=Family.objects.get(id=3)) # House.objects.create(id=4,location='地球',family_id=Family.objects.get(id=4)) Cars.objects.create(id=1,name='筋斗雲',Family=Family.objects.get(id=1)) Cars.objects.create(id=2,name='引力',Family=Family.objects.get(id=2)) Cars.objects.create(id=3,name='意念',Family=Family.objects.get(id=3)) Cars.objects.create(id=4,name='翅膀',Family=Family.objects.get(id=4))
有外鍵關聯的數據,插入數據時是插入整個外鍵的對象。例如:Family的外鍵關聯到Student,Family表中的stu_id要填入對應的Student的對象。
查詢語句
def select_compex():
#普通查詢語句 # result_one = Student.objects.all() #過濾 # result_two = House.objects.filter(id=3) #related_name,外鍵字段使用 #通過Student查詢到Family的數據 # result_three = Student.objects.get(id=2) # result_four = result_three.student.all() # result_three = Student.objects.get(id=2) # result_four = result_three.student.all()
django數據庫雙下划線操作。
django數據庫中沒有連表的操作,沒有sqlalchemy中的join操作,它使用了一種更簡潔的操作‘__’ ,雙下划線。
使用雙下划線可以完成連表操作,可以正向查詢,也可以反向查詢。
# Student <----- Family <------ House
|
|----------- Cars
#正向查詢一層
#查詢Family表,約束條件是Student表中的姓名是 ‘悟空’
# result_seven = Family.objects.filter(stu_id__name='悟空')
#正向查詢兩層
#查詢House表,約束條件是Student表中的name是 悟空
# result_eight = House.objects.filter(family_id__stu_id__name='悟空')
#反向查詢一層
#查詢Student表,約束關系是Family表中的 id 是 1 # result_five = Student.objects.filter(student__id=1) # for x in result_five: # print x.id,x.name
#反向查詢兩層
#查詢student表,約束關系是House表中的 id 是 3
# Student <----- Family <------ House
# 兩個技巧,一、反向查詢 二、兩層操作 # result_six = Student.objects.filter(student__family__id=3) # for x in result_six: # print x.id,x.name '''
#正反向混合查詢
House表和Car表的外鍵同時指定到Family;查詢House表,約束條件是car表中的name字段為 筋斗雲。
# result_fiveteen = House.objects.filter(family_id__family_to_car__name='筋斗雲')
# result_six = Student.objects.filter(id=3) # result_eight = Student.objects.get(id=3) # result_nine = Student.objects.all() #and和or查詢 #and查詢
#與查詢,並列查詢,直接將條件全部都寫在查詢括號中就可 # result_ten = House.objects.filter(location='地球',id=1) #or查詢
#django的查詢語句的或運算沒有sqlalchemy中的or關鍵字,這里是使用了關鍵字Q,使用Q將查詢語句包裹,然后使用 | 連接,完成或查詢。 # result_eleven = House.objects.filter(Q(location='地球')|Q(id=1)) #or查詢 # result_twenty = House.objects.filter(Q(location='地球')|Q(id=1)|Q(id=3)) #排除字段 #exclude不等於,即排除這個條件其他都查詢出來。例如:查詢Family中id不等於1的 # result_thirteen = Family.objects.exclude(id=1) #offset和limit #Django中沒有sqlalchemy里切片的關鍵字offset和limit。可以直接使用類似python中切片的操作[]。 # result_foutteen = Student.objects.all()[2:4] #精確查詢 #exact精確匹配,區分大小寫 #iexact精確匹配,不區分大小寫 result_sixteen = Student.objects.filter(name__iexact='空') #模糊查詢 #contains模糊查詢碼,區分大小寫 #icontains模糊查詢,不區分大小寫 result_seventeen = Student.objects.filter(name__contains='K') result_seventeen = Student.objects.filter(name__contains='K')
filter和all查詢出來都是列表,QuerySet類型的數據。QuerySet是一個可遍歷結構,包含一個或多個元素,每個元素都是一個Model 實例 QuerySet類似於Python中的list
get查詢出來是對象。 for x in result_seventeen: print x.id,x.name print '查詢長度' print result_seventeen.count()