本文转载自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})