本文轉載自https://blog.csdn.net/xiaogeldx/article/details/87899499python
orm的優點:用面向對象的方式描述數據庫,操做數據庫,不用直接編寫sql代碼,只需像操做對象同樣從數據庫操做數據mysql
orm系統的方法-(封裝)-Python代碼-(執行)-sql語句-(操做)-數據庫sql
一個數據表對應一個模型類,表中的字段對應模型中的類屬性,一個實例對應數據表中的一條數據shell
django不光支持mysql,一些流行的數據庫都支持數據庫
修改配置(settings.py)django
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'django_test', 'USER':'xiaoge', 'PASSWORD':'*****', 'HOST':'127.0.0.1', 'PORT':'****' } }
修改項目文件夾(和settings.py文件所在的目錄)下的__init__.py添加代碼:編程
import pymysql pymysql.install_as_MySQLdb()
設置時區(settings.py)app
TIME_ZONE = 'Asia/ShangHai' #北京時間
在students中的models.py文件中建立模型編程語言
from django.db import models class Student(models.Model): #繼承 #能夠不寫主鍵,模型會建立 # id = models.IntegerField(primary_key=True,auto_created=True) name = models.CharField(max_length=20) #字符串 age = models.SmallIntegerField(default=0) #整數,默認爲0,表示沒填 sex = models.SmallIntegerField(default=1) #整數,默認爲1(男) qq = models.CharField(max_length=20,default='') #字符串,默認不填 phone = models.CharField(max_length=20,default='') #字符串,默認不填 c_time = models.DateTimeField(verbose_name='建立時間',auto_now_add=True) #建立時間,自動記錄當前時間 def __str__(self): return '%s-%s' % (self.name,self.age)
此時數據庫中尚未表,須要運行migrate命令使遷移生效工具
python manage.py migrate students
要修改數據庫,都要修改模型,而後運行數據庫遷移命令,再運行使遷移生效命令
django shell調試工具
python manage.py shell
導入模型
from students.models import Student
存在數據庫裏的時間(c_time)是UTC時間,取出時自動轉換設置的時區
Student.objects.filter(sex=1)
In [16]: res = Student.objects.all() #查1 這時不會操做數據庫 In [15]: Student.objects.all() #這時查全部數據,返回QuerySet(查詢集) Out[15]: <QuerySet [<Student: xiaoge-16>, <Student: na-17>, <Student: wen-25>, <Student: yi-0>]> QuerySet是惰性的 In [17]: print(res.query) #Student.objects.all()背後執行的sql語句 SELECT `students_student`.`id`, `students_student`.`name`, `students_student`.`age`, `students_student`.`sex`, `students_student`.`qq`, `students_student`.`phone`, `students_student`.`c_time` FROM `students_student` #select * from students_student In [18]: res #查1 結合16步 返回一個查詢集,能夠for循環,迭代,切片 Out[18]: <QuerySet [<Student: xiaoge-16>, <Student: na-17>, <Student: wen-25>, <Student: yi-0>]> In [19]: print(res[1:2].query) #切片 SELECT `students_student`.`id`, `students_student`.`name`, `students_student`.`age`, `students_student`.`sex`, `students_student`.`qq`, `students_student`.`phone`, `students_student`.`c_time` FROM `students_student` LIMIT 1 OFFSET 1 In [20]: Student.objects.get(id=1) # 查2 返回查詢對象 Out[20]: <Student: xiaoge-16> In [21]: Student.objects.get(name='yi') #get通常和主鍵對應 Out[21]: <Student: yi-0> In [23]: Student.objects.get(pk=1) #pk即主鍵,防止查錯主鍵名 Out[23]: <Student: xiaoge-16> In [25]: res = Student.objects.filter(sex=1) #查3 篩選 In [26]: res Out[26]: <QuerySet [<Student: xiaoge-16>, <Student: na-17>, <Student: wen-25>, <Student: yi-0>]> In [28]: print(res.query) SELECT `students_student`.`id`, `students_student`.`name`, `students_student`.`age`, `students_student`.`sex`, `students_student`.`qq`, `students_student`.`phone`, `students_student`.`c_time` FROM `students_student` WHERE `students_student`.`sex` = 1
當get匹配到多條數據時,會報錯
In [30]: s = Student.objects.get(name='xiaoge')
In [31]: s
Out[31]: <Student: xiaoge-16>
In [32]: s.age = 15 #改方法1 改一條數據
In [33]: s.save()
In [34]: Student.objects.get(pk=1)
Out[34]: <Student: xiaoge-15>
In [35]: Student.objects.filter(name='yi').update(age=19) #改方法2 能夠改多條數據
Out[35]: 1 #成功返回1
In [36]: Student.objects.get(name='yi')
Out[36]: <Student: yi-19>
In [38]: s = Student.objects.get(id=2) #刪一條 38-40步 In [39]: s Out[39]: <Student: na-17> In [40]: s.delete() Out[40]: (1, {'students.Student': 1}) In [41]: Student.objects.filter(gender=1).delete() #能夠刪多條 In [42]: Student.objects.filter(sex=1).delete() Out[42]: (3, {'students.Student': 3})