ORM
ORM是Object Relation mappiong,简单来说就是将编程语言中的对象映射到数据库中。这边的对象就是数据库中的各种表,ORM模型作用在于编程人员更换数据库引擎时,不必每次重新编写sql语句,只要通过编程语言自动生成对应的sql语句,这样大大地提升了效率。
python下的ORM:在应用目录下的models下可以编写要映射到数据库的表,格式如下
class Book(models.Model): id = models.AutoField(primary_key=True) #auto为自增型 title = models.CharField(max_length=32) #char为字符型 state = models.BooleanField() #Boolean为布尔型 pub_data = models.DateField() #Date为日期型 price = models.DecimalField(max_digits=8,decimal_places=2) #Decimal为十进制小数 publish = models.CharField(max_length=32)
其中数据类型和mysql很多相似,只是语法变了。
django引入ORM时,要在主目录下的_init__文件下写入:
import pymysql pymysql.install_as_MySQLdb()
因为django默认的数据库驱动为MySQLdb,python3与其兼容有问题,所以要是用pymysql作为驱动。
同时主目录下settings文件中的databases属性要改为:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql',#引擎驱动 'NAME': 'orm', #数据库名 'USER': 'root', #用户名 'password': '', #密码 'HOST': '127.0.0.1', #ip 'port': 3306, #端口号 } }
注意事项:python3.4以上版本和django2.0以上版本共同使用时,会报错。因为MySQLclient只支持到python3.4,所以要将项目下的报错的目录,Lib\site-packages\django\db\backends\mysql\中的如下代码注释。
if version < (1, 3, 13): raise ImproperlyConfigured('mysqlclient 1.3.13 or newer is required; you have %s.' % Database.__version__)
然后使用python(python3) manage.py makemigrations:
再使用python manage.py migrate:
最后在mysql数据库中可以看到新建的表:
产生了一个app01_book的表,还有一些其他自动生成的很多表。其中app01_book的字段:
最后如果想在控制台看到ORM将类转换为sql语句的过程,可以在settings文件下加上:
LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': { 'console':{ 'level':'DEBUG', 'class':'logging.StreamHandler', }, }, 'loggers': { 'django.db.backends': { 'handlers': ['console'], 'propagate': True, 'level':'DEBUG', }, } }
一、单表操作
当model下创建了表类时,在views下可以控制表的操作
(1)添加
def index(request): #添加记录 # 方式1: # book_obj = Book(id=1,title='pythonredbook',state=True,price=100,pub_data='1019-6-28', # publish='cn') # book_obj.save() # 方式2:create返回的就是对象记录 Book.objects.create(title='linux',state=False,price=88,pub_data='2020-6-28' ,publish='ua') return HttpResponse('ok')
在mysql数据里可以看到创建的表记录
(2)查询和模糊查询
查询:
book_list = Book.objects.all() #返回的是一个列表对象,一个对象里存一个字段
book_list = Book.objects.all().first()#调用者时queryset对象,返回model对象 book_list = Book.objects.all()[0]#和first一样 book_list = Book.objects.filter(prince=100)#filter类似于sql的where语句,括号里的是条件 book_list = Book.objects.filter(prince=100).first() book_list = Book.objects.get(title='linux')#有且只有一个才会返回,否则报错
book_list = Book.objects.exclude(title='linux')#和filter相反,打印出除了符合括号里的其他数据
book_list = Book.objects.all().order_by('id') #排序,默认是ASC升序
book_list = Book.objects.all().order_by('-id')#-号是desc降序
book_list = Book.objects.all().order_by('id').reverse()#反转排序
book_list = Book.objects.all().count()#计数
book_list = Book.objects.all().values('price')#以字典形式返回对象price的值
book_list = Book.objects.all().values_list('price','title')#以元祖形式返回对象price、title的值
book_list = Book.objects.all().distinct()#去重,一样的字段的记录只取一条,配合values使用比较好
模糊查询:指的是 > < 等。
book_list = Book.objects.filter(price__gt=10,price__lt=200)#价格大于10小于200 book_list = Book.objects.filter(title__startswith='py')#以py开头的title记录 book_list = Book.objects.filter(title__contains='py')#title包含'py'的,区别大小写 book_list = Book.objects.filter(title__icontains='py')#title包含'py'的,不区分大小写 book_list = Book.objects.filter(price__in=[100,200,300])#判断是在列表中的数据 book_list = Book.objects.filter(price__range=[100,200])#相当于lt和gt的同时使用 book_list = Book.objects.filter(pub_data_year=2019)#只有date数据类型可以使用
(3)删除和修改
book_list = Book.objects.filter(price=100).delete()#删除price=100的记录 book_list = Book.objects.filter(price=100).update(price=300)#修改price=100的记录变为300