zoukankan      html  css  js  c++  java
  • Django之数据库基础操作

     1、创建model表,在setting中添加app名称、配置数据

    from django.db import models
       
    class userinfo(models.Model):
       #如果没有models.AutoField,默认会创建一个id的自增列
        name = models.CharField(max_length=30)
        email = models.EmailField()
        memo = models.TextField()
    

     运行:python manage.py makemigrations     python manage.py migrate  生成相应的表

     注:创建数据时,注意指定编码:

    CREATE DATABASE db_name DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
    

     在html页面中添加

    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    

     解决编码中文乱码问题。


     如果后台要用到该表,还需在admin.py中注册,如下:

    2、数据库增、删、改、查

    查询篇

    models.UserInfo.objects.all()
    models.UserInfo.objects.all().values('user')             #只取user列
    models.UserInfo.objects.all().values_list('id','user')   #取出id和user列,并生成一个列表
    models.UserInfo.objects.get(id=1)
    models.UserInfo.objects.get(user='yangmv')
    

     

    增加篇

    models.UserInfo.objects.create(user='yangmv',pwd='123456')
    或者
    obj = models.UserInfo(user='yangmv',pwd='123456')
    obj.save()
    或者
    dic = {'user':'yangmv','pwd':'123456'}
    models.UserInfo.objects.create(**dic)
    

     

    删除篇

    models.UserInfo.objects.filter(user='yangmv').delete()
    

     

    修改篇

    models.UserInfo.objects.filter(user='yangmv').update(pwd='520')
    或者
    obj = models.UserInfo.objects.get(user='yangmv')
    obj.pwd = '520'
    obj.save()
    

     

    常用方法:

    # 获取个数
        #
        # models.Tb1.objects.filter(name='seven').count()
        # 大于,小于
        #
        # models.Tb1.objects.filter(id__gt=1)              # 获取id大于1的值
        # models.Tb1.objects.filter(id__lt=10)             # 获取id小于10的值
        # models.Tb1.objects.filter(id__lt=10, id__gt=1)   # 获取id大于1 且 小于10的值
        # in
        #
        # models.Tb1.objects.filter(id__in=[11, 22, 33])   # 获取id等于11、22、33的数据
        # models.Tb1.objects.exclude(id__in=[11, 22, 33])  # not in
        # contains
        #
        # models.Tb1.objects.filter(name__contains="ven")
        # models.Tb1.objects.filter(name__icontains="ven") # icontains大小写不敏感
        # models.Tb1.objects.exclude(name__icontains="ven")
        # range
        #
        # models.Tb1.objects.filter(id__range=[1, 2])   # 范围bettwen and
        # 其他类似
        #
        # startswith,istartswith, endswith, iendswith,
        # order by
        #
        # models.Tb1.objects.filter(name='seven').order_by('id')    # asc
        # models.Tb1.objects.filter(name='seven').order_by('-id')   # desc
        # limit 、offset
        #
        # models.Tb1.objects.all()[10:20]
        # group by
        from django.db.models import Count, Min, Max, Sum
        # models.Tb1.objects.filter(c1=1).values('id').annotate(c=Count('num'))
        # SELECT "app01_tb1"."id", COUNT("app01_tb1"."num") AS "c" FROM "app01_tb1" WHERE "app01_tb1"."c1" = 1 GROUP BY "app01_tb1"."id"
    

     3、Django高级查询

    filter查询:

    1.  等于 exact。
    例:查询name等于‘xiao ming’的学生
    Student.objects.filter(name='xiao ming')
    Student.objects.filter(name__exact='xiao ming')#此处的exact可以省略
    
    2.  模糊查询 like
        包含 contains
    例:查询姓名包含'xiao'的学生。 
    Student.objects.filter(name__contains='xiao') 
    开头:startswith 结尾:endswith 
    例:查询姓名以'xiao'开头的学生 以'ming'结尾的学生 
    Student.objects.filter(name__startswith='xiao') 
    Student.objects.filter(name__endswith='ming')
    
    3.  空查询   isnull
    例:查询姓名不为空的学生
    Student.objects.filter(name__isnull=False)
    
    4.  范围查询  in 
    例:查询年龄12或15或16的学生
    Student.objects.filter(age__in=[12,15,16])
    
    5.  比较查询 gt lt(less than) gte(equal) lte
    例:查询年龄大于等于12的学生
    Student.objects.filter(age__gte=12)
    
    6. 日期查询 date 例:查询1994年出生的学生。 
    Student.objects.filter(birthyear__date=1994) 
    例:查询1994年1月1日后出生的学生。 
    Student.objects.filter(birthyear__date__gt = date(1994,1,1))
    
    7. 返回不满足条件的数据 exclude
    例:查询id不为3的学生。
    Student.objects.exclude(id=3)
    

     同时传递多个字段参数限制,但是这样传递的字段参数限制为与运算

    Student.objects.filter(name='xiao ming',age=12)
    

     但是我们要查询姓名是'xiao ming'或者年龄等于12该如何使用?Q对象可以用来在字段限制间进行逻辑运算(&,|,~)

    from django.db.models import Q #引入
    Student.objects.filter(Q(name='xiao ming')|Q(age=12))
    

     聚合函数:

    QuerySet通过aggregate这个函数来实现聚合功能

    使用前需先导入聚合类: 
    from django.db.models import Sum,Count,Max,Min,Avg 
    例:查询所有学生的数目
    select count(*) from student; 
    Student.objects.aggregate(Count('id')) 
    {'id__count': 5} 注意返回值类型及键名 
    例:查询所有学生年龄和 
    Student.objects.aggregate(Sum(‘age’)) 
    {‘age__sum’:120} 注意返回值类型及键名
    

     字段排序:

    QuerySet 通过order_by来对字段进行排序

    对年龄从小到大进行排序
    Student.objects.all().order_by('age')
    对年龄从大到小进行排序
    Student.objects.all().order_by('-age')
    

     自定义查询语句

    通过Django的connection对象直接执行SQL语句

    cursor = connection.cursor() 
    sql='''select name,age from student ''' 
    cursor.execute(sql) fetchall=cursor.fetchall() 
    students=[] 
    for object in fetchall: 
    	students.append({'name':object[0],'age':object[1]})
    

    通过connection获取游标,然后通过游标执行SQL语句,通过fetchall函数返回查询结果,注意返回结果为一个集合,里面每个元素为一个数组,以select 后面字段顺序返回

    我们可以使用同样方法对数据进行增加修改删除操作,不过与查询有点不同的是需要transaction进行提交修改

    cursor = connection.cursor() 
    sql='''update student set age=13 where name='xiao ming' ''' 
    cursor.execute(sql) 
    transaction.commit_unless_managed()
    
     
  • 相关阅读:
    python使用suds来调用webservice
    第二章 :初识MySQL
    什么是端口概念?
    数据库中的五种约束
    MySQL基本概念以及简单操作
    Java 持久化操作之 --XML
    Soso(嗖嗖)移动 java 项目
    Java多线程笔记总结
    java中代码的注释和快捷
    java oop 单列 双列 集合, 迭代器 的使用和说明
  • 原文地址:https://www.cnblogs.com/honey-badger/p/8593578.html
Copyright © 2011-2022 走看看