zoukankan      html  css  js  c++  java
  • day58

    day58

    1阉割模式

    没设置,设置了10个,用户写100个竟然可以存的进去,而且把后面90个阉割了,不符合要求
    所以,必须设置阉割模式
     
    

    1.2 会话

    发送命令,回复响应叫会话
    
    不能重启数据库,只能启用临时会话的格式
    下次会话(再用),便没了
    

    1.3 设置命令

    临时设置当前对话的

    公司如果没法更改全的,临时更改会话,下次重启没了

    create table t1(id int primary key auto_increment, name char(5))
    desc t1;
    insert (into 可以不写) t1(name) values('爱心觉罗大大大');
    insert into t1(name) values('爱心觉罗大大大');
    
    mysql> select * from t1;
    +----+-----------------+
    | id | name            |
    +----+-----------------+
    |  1 | 爱心觉罗大      |
    +----+-----------------+
    1 row in set (0.00 sec)
    
    set sql_mode ='STRICT_TRANS_TABLES';
    
    mysql> insert into t1(name) values('爱心觉罗大大d大');
    ERROR 1406 (22001): Data too long for column 'name' at row 1
    
    mysql> select @@sql_mode;
    +---------------------+
    | @@sql_mode          |
    +---------------------+
    | STRICT_TRANS_TABLES |
    +---------------------+
    1 row in set (0.00 sec)
    

    下次启用

    mysql> select @@sql_mode;
    +------------------------+
    | @@sql_mode             |
    +------------------------+
    | NO_ENGINE_SUBSTITUTION |
    +------------------------+
    1 row in set (0.00 sec)
    

    把所有会话全设置

    先加方式二,再加方式三 ,那么就可以实现下次自动阉割模式

    方式二**:先执行select @@global.sql_mode,复制查询出来的值并将其中的NO_ZERO_IN_DATE,NO_ZERO_DATE删除,然后执行set global sql_mode = '修改后的值'。
    
    ​        此方法在当前服务中生效,重新MySQL服务后失效
    
      **方法三**:在mysql的安装目录下,或my.cnf文件(windows系统是my.ini文件),新增 sql_mode = ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,
    
    ​        添加my.cnf如下:
    ​        [mysqld]
    
    sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER
    
    ​        然后重启mysql。
    ​    此方法永久生效.当然生产环境上是禁止重启MySQL服务的,所以采用方式二加方式三来解决线上的问题,那么即便是有一天真的重启了MySQL服务,也会永久生效了。
    

    1.4 为什么讲阉割?

    当静态文件没加载出来时,因为setting 里的    'django.contrib.staticfiles',
    文件可以实现静态文件的static   然后使用makemigrations 
    和 migrate 更新一下 models 生成 连接
    
    1.5 orm配置

    mysql 里面通过orm创建一个表

    1 mysql --- 创建一个库 rom01

    2 settings -- DATABASES 这个配置

    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME':'day57',  # 要连接的数据库,连接前需要创建好
            'USER':'root',  # 连接数据库的用户名
            'PASSWORD':'123',  # 连接数据库的密码
            'HOST':'127.0.0.1',  # 连接主机,默认本级
            'PORT':3306      #  端口 默认3306
        }
    }
    

    3 和settings 同级目录的 init.py

    import pymysql
    pymysql.install_as_MySQLdb()
    

    4 model.py

    mysql表和属性

    类和属性

    class Book(models.Model):     
    	id = models.AutoField(primary_key = True)
    

    5 执行指令

    python manage.py makemigrations
    python manage.py migrate
    

    开发:

    专心,不专心做不了开发。别人没法打扰到自己,自己也不会打断自己。
    火车上读书——毛主席
    定位错误,排错能力特别强。特别认真。
    学习,研究问题,记录错误。
    

    2 程序增删改查

    2.2 查看的语句(了解)
    # from django.db import connection    # connection管道,
    #                             # conn = pymysql.connect()
    # print(connection.queries)       # orm 转换成sql语句,插入数据库
    #                                 ##通过这种方式也能查看执行的sql语句
    
    2019-05-23 <class 'datetime.date'>
    [{'sql': 'SELECT @@SQL_AUTO_IS_NULL', 'time': '0.001'}, {'sql': "INSERT INTO `app01_book` (`name`, `price`, `date`) VALUES ('三国', 100, '2019-05-23')", 'time': '0.000'}]
    
    2.31 创建数据

    方式1

    from app01 import models
    def show(request):		 #   url(r'show/',views.show) 	   		date = datetime.date.today()
        # print(date,type(date))
        # book_obj = models.Book(name='三国',price=100,date=date)
        # # book_obj = models.Book(name='水浒',price=100,date='2018-12-12')
     
        # book_obj.save()  # 往数据库里保存
    

    方式2

     
        # book_obj = models.Book.objects.create(
        #     name='三国1', price=100,date='2018-12-12'
        # )
        # # 封装了save
        # print(book_obj)  # create方法  返回的model对象
        # print(book_obj.name)
    
    
    2.3 简单查询
    		
      all_objs = models.Book.objects.all()         #objects管理器
        print(all_objs)         #<QuerySet [<Book: Book object>, <Book: Book object>, <Book: Book object>]>
    
                                #<QuerySet [<Book: 水浒>, <Book: 三国>, <Book: 三国1>]>
    
        # set是集合  一个个model对象    通过objects调用的是一个对象    操作起来像列表  索引取值
        # 查询条件数据
        book_obj = models.Book.objects.filter(
            # pk = 1
            id = 1
        )
        print(book_obj)     #<QuerySet [<Book: 水浒>]>   pk  patch key  配备键
    
    
    
    2.4 删除改
        # 删除
        # models.Book.objects.filter(pk=1).delete()   # delete() 在queryset对象里去删  不在objects models删,防止都删了
    
    
        # 更新也是
        # models.Book.objects.filter(name='三国').update(
        #     price=222,date='2018-11-11'
        #                 # 更新多个  ,都可以
        # )
    
    
    
    
        # book_obj1 = models.Book.objects.filter(price = 1000 )
        # <QuerySet []>                                  # filter 不会报错,返回的是queryset对象
    
        # model  调用方法
        # book_obj1 = models.Book.objects.get(id = 3 )        # get必须获得一条数据 如果多条 price=100 可以找到多条语句报错
        # book_obj1 = models.Book.objects.get(price = 1000 )        # get必须获得一条数据 如果多条 price=100 可以找到多条语句报错
    
        # print(book_obj1)    #三国     获取单条记录 并且是model对象,并不是queryset
            # 两种错误
                # get 方法获取数据的两种错误,get方法必须获取一条数据
                # 多和少   return 3   not exit
    
        # book_obj1.delete()      #  直接调用 也可以删除
        # 谁调用 model对象和 obj 对象  都可以删除
    
        # obj_lst = []
        # for i in range(1,11):
        #
        #     obj = models.Book(name='太白%s'%i,price=10*i,date='2019-5-%s'%i)
        #     obj_lst.append(obj)
        #
        # models.Book.objects.bulk_create(obj_lst)        # 批量创建 保存save封装
    
    
        # book_obj1.update(name='jin')     # 'Book' object has no attribute 'update'
    
    
    
        # update_or_create    方法 ,有更新,没有就创建
        obj1,obj2 = models.Book.objects.update_or_create(
            # 查 封装了  name
            name='太白2', # 查询参数
            defaults = {    #下面需要添加的值
                'price':111,
                'date':'2011-1-22'
            }
        )                       #太白22--111 True 没有的
        print(obj1,obj2)        # 水浒2-111  false 没创建
            #如果查询的数据为多条  因为调用的是get方法       少了 不报错  异常捕获crate方法
            #get() returned more than one Book -- it returned 7!
    
    
    2.5查询API(重点)
    all			queryset   
    filter()  	queryset 要想拿一个索引取值
    (,)#and 
    get   返回models对象  多少都报错
    exclude()  	 排除
    
    
    2.6 作业需求
    submit 添加一条到了数据库,数据库显示在查看书籍
    删除
    
    1. 点击添加按钮,跳转到添加页面,用户输入内容,然后点击提交按钮,将用户输入的数据保存到数据库,并自动跳转到信息展示页面
    
    2 点击删除按钮,从数据库中删除对应的数据,并且自动跳转到信息展示页面
    
    
    3 点击编辑按钮,跳转到一个新的页面,这个页面的形式和添加页面是一样的,但是里面有有默认值,然后用户点击提交,将用户提交的
    
    
    修改
    type = date 可以选择的 value指定默认值时,通过给加格式
    
    给django连接mysql的指定阉割模式的配置
    
    
    
    2.7Django设置阉割模式
    一:
    DATABASES = {
        'default': {
        .....
        'OPTIONS': {
                "init_command": "SET default_storage_engine='INNODB'",
           #'init_command': "SET sql_mode='STRICT_TRANS_TABLES'",
    
    
            }
        }
    }        
    二
    DATABASES['default']['OPTIONS']['init_command'] = "SET sql_mode='STRICT_TRANS_TABLES'"
    
    
    
    2.8 时区
    mysql不识别时区,东八区   和utc的事件晚了八个小时 , 比如:存入时间12h,查的4h可到
    
    
    2.9 代码
    from django.shortcuts import render,HttpResponse
    from app01 import models
    # from app01.models import Book
    
    import datetime
    # Create your views here.
    def show(request):
        # 创建数据
        # # 方式1
        # date = datetime.date.today()
        # print(date,type(date))
        # book_obj = models.Book(name='三国',price=100,date=date)
        # # book_obj = models.Book(name='水浒',price=100,date='2018-12-12')
        #
        # book_obj.save()  # 往数据库里保存
        #
        # from django.db import connection    # connection管道,
        #                             # conn = pymysql.connect()
        # print(connection.queries)       # orm 转换成sql语句,插入数据库
        #                                 ##通过这种方式也能查看执行的sql语句
    
        # 方式2
        # book_obj = models.Book.objects.create(
        #     name='三国1', price=100,date='2018-12-12'
        # )
        # # 封装了save
        # print(book_obj)  # create方法  返回的model对象
        # print(book_obj.name)
    
    
        all_objs = models.Book.objects.all()         #objects管理器
        print(all_objs)         #<QuerySet [<Book: Book object>, <Book: Book object>, <Book: Book object>]>
    
                                #<QuerySet [<Book: 水浒>, <Book: 三国>, <Book: 三国1>]>
    
        # set是集合  一个个model对象    通过objects调用的是一个对象    操作起来像列表  索引取值
        # 查询条件数据
        book_obj = models.Book.objects.filter(
            # pk = 1
            id = 1
        )
        print(book_obj)     #<QuerySet [<Book: 水浒>]>   pk  patch key  配备键
    
    
        # 删除
        # models.Book.objects.filter(pk=1).delete()   # delete() 在queryset对象里去删  不在objects models删,防止都删了
    
    
        # 更新也是
        # models.Book.objects.filter(name='三国').update(
        #     price=222,date='2018-11-11'
        #                 # 更新多个  ,都可以
        # )
    
    
    
    
        # book_obj1 = models.Book.objects.filter(price = 1000 )
        # <QuerySet []>                                  # filter 不会报错,返回的是queryset对象
    
        # model  调用方法
        # book_obj1 = models.Book.objects.get(id = 3 )        # get必须获得一条数据 如果多条 price=100 可以找到多条语句报错
        # book_obj1 = models.Book.objects.get(price = 1000 )        # get必须获得一条数据 如果多条 price=100 可以找到多条语句报错
    
        # print(book_obj1)    #三国     获取单条记录 并且是model对象,并不是queryset
            # 两种错误
                # get 方法获取数据的两种错误,get方法必须获取一条数据
                # 多和少   return 3   not exit
    
        # book_obj1.delete()      #  直接调用 也可以删除
        # 谁调用 model对象和 obj 对象  都可以删除
    
        # obj_lst = []
        # for i in range(1,11):
        #
        #     obj = models.Book(name='太白%s'%i,price=10*i,date='2019-5-%s'%i)
        #     obj_lst.append(obj)
        #
        # models.Book.objects.bulk_create(obj_lst)        # 批量创建 保存save封装
    
    
        # book_obj1.update(name='jin')     # 'Book' object has no attribute 'update'
    
    
    
        # update_or_create    方法 ,有更新,没有就创建
        obj1,obj2 = models.Book.objects.update_or_create(
            # 查 封装了  name
            name='太白2', # 查询参数
            defaults = {    #下面需要添加的值
                'price':111,
                'date':'2011-1-22'
            }
        )                       #太白22--111 True 没有的
        print(obj1,obj2)        # 水浒2-111  false 没创建
            #如果查询的数据为多条  因为调用的是get方法       少了 不报错  异常捕获crate方法
            #get() returned more than one Book -- it returned 7!
    
        return HttpResponse('ok')
    
    def query(request):
        # exclude 排除,可以通过objects来调用,还可以通过queryset来调用
        # obj_list = models.Book.objects.exclude(id=6)
        #                             # 返回 queryset 可以调用.方法
        # print(obj_list)         #<QuerySet [<Book: 三国1--100>, <Book: 太白1--10>, <Book: 太白2--20>, <Book: 太白4--40>,
        #                     #除了id=6的都提出来了
        # obj_list1 = models.Book.objects.filter(price=100).exclude(id=4)
        # print(obj_list1)
    
    
    # 排序                    # 管理器   按照price queryset类型
    #     obj_list2 = models.Book.objects.all().order_by('price')   # 加个-  -price (降序)  id 加个相同的按照id排序
    #     print(obj_list2)    # 默认升序
    
    
        obj_list1 = models.Book.objects.all().order_by('-price').reverse()   # 加个-  -price (降序)  id 加个相同的按照id排序
        print(obj_list1)
        obj_list2 = models.Book.objects.all().reverse()
        print(obj_list2)
        # 也可以按name排序,ascii首字母码 ,或者unicode中文
    
        # 数
        # obj_count = models.Book.objects.filter(price=100).count()
        # print(obj_count)        #8
    
        # obj_list3 = models.Book.objects.filter(price=100)
        # print(obj_list3.first())    #三国1--100
        # print(obj_list3[0])    #三国1--100   model类型,没法.用法
    
        # obj_list4 = models.Book.objects.filter(price=100)
        # print(obj_list4.exists())        #True  用法:判断有没有数据,做什么事情
    
        # 三种判断
        # if obj_list4:     # 把所有数据都取出来
            # if obj_list4.exists():  只判断一条数据 效率高  用这个
            #if obj.list4.count()   # 把所有数据都取出来也是
    
    
        obj_list5 = models.Book.objects.filter(price=100).values('id','name')
        # for obj in obj_list5:
        #     print(obj.id)  # models对象  只能用属性
    
        print(obj_list5)  # 返回字典类型 所有的符合id name的
        obj_list5 = models.Book.objects.filter(price=100).values_list('id','name')  # 返回元祖
                    # 都是返回的queryset类型  上面的方法都可以用  所以这样
        print(obj_list5,obj_list5[0],)
        print(type(obj_list5[0]))   #<class 'tuple'>
    
    
        # values 和 value_list 都有 自动去重  distinct
        obj_list6 = models.Book.objects.all().values('price').distinct()  # 两个例子的情况都重复才算重复
        print(obj_list6)        #<QuerySet [{'price': 100}, {'price': 10}, {'price': 20}, {'price': 30}, {'price': 40}, {'price': 50}, {'price': 60}, {'price': 70}, {'price': 80}, {'price': 90}, {'price': 111}]>
    
    
    
        aaa = models.Book.objects.filter(price__in=[11,22,33])
        print(aaa)  #<QuerySet []>
        aaa = models.Book.objects.filter(price__gte=100)    # >= gte        > 100  gt
        print(aaa)
    
        # obj_list7 = models.Book.objects.filter(title_contains='太白')
        # print(obj_list7)
    
        # obj_list8 = models.Book.objects.filter(date__year='2019',date__day='04')
        obj_list8 = models.Book.objects.filter(date__year='2019',date__day__gt='04')
        #  双下滑线方法都可以连着用
    
        print(obj_list8)
    
        return HttpResponse('ok')
    
    

    3

    <1> all():                  查询所有结果,结果是queryset类型
      
    <2> filter(**kwargs):       它包含了与所给筛选条件相匹配的对象,结果也是queryset类型 Book.objects.filter(title='linux',price=100) #里面的多个条件用逗号分开,并且这几个条件必须都成立,是and的关系,or关系的我们后面再学,直接在这里写是搞不定or的
      
    <3> get(**kwargs):          返回与所给筛选条件相匹配的对象,不是queryset类型,是行记录对象,返回结果有且只有一个,
                                如果符合筛选条件的对象超过一个或者没有都会抛出错误。捕获异常try。  Book.objects.get(id=1)
      				两个错误类型:
    <4> exclude(**kwargs):      排除的意思,它包含了与所给筛选条件不匹配的对象,没有不等于的操作昂,用这个exclude,返回值是queryset类型 Book.objects.exclude(id=6),返回id不等于6的所有的对象,或者在queryset基础上调用,Book.objects.all().exclude(id=6)
                     
    <5> order_by(*field):       queryset类型的数据来调用,对查询结果排序,默认是按照id来升序排列的,返回值还是queryset类型
                      models.Book.objects.all().order_by('price','id') #直接写price,默认是按照price升序排列,按照字段降序排列,就写个负号就行了order_by('-price'),order_by('price','id')是多条件排序,按照price进行升序,price相同的数据,按照id进行升序
            
    <6> reverse():              queryset类型的数据来调用,对查询结果反向排序,返回值还是queryset类型
      
    <7> count():                queryset类型的数据来调用,返回数据库中匹配查询(QuerySet)的对象数量。
      
    <8> first():                queryset类型的数据来调用,返回第一条记录 Book.objects.all()[0] = Book.objects.all().first(),得到的都是model对象,不是queryset
      
    <9> last():                queryset类型的数据来调用,返回最后一条记录
      
    <10> exists():              queryset类型的数据来调用,如果QuerySet包含数据,就返回True,否则返回False
                       空的queryset类型数据也有布尔值True和False,但是一般不用它来判断数据库里面是不是有数据,如果有大量的数据,你用它来判断,那么就需要查询出所有的数据,效率太差了,用count或者exits
                     例:all_books = models.Book.objects.all().exists() #翻译成的sql是SELECT (1) AS `a` FROM `app01_book` LIMIT 1,就是通过limit 1,取一条来看看是不是有数据
    
    <11> values(*field):        用的比较多,queryset类型的数据来调用,返回一个ValueQuerySet——一个特殊的QuerySet,运行后得到的并不是一系列
                                model的实例化对象,而是一个可迭代的字典序列,只要是返回的queryset类型,就可以继续链式调用queryset类型的其他的查找方法,其他方法也是一样的。
                                不在是一个个model对象而是字典
                                
    <12> values_list(*field):   它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典序列
     
    <13> distinct():            values和values_list得到的queryset类型的数据来调用,从返回结果中剔除重复纪录
    
    
    2.9基于双下划线的模糊查询
    Book.objects.filter(price__in=[100,200,300]) #price值等于这三个里面的任意一个的对象
    Book.objects.filter(price__gt=100)  #大于,大于等于是price__gte=100,别写price>100,这种参数不支持
    Book.objects.filter(price__lt=100)
    Book.objects.filter(price__range=[100,200])  #sql的between and,大于等于100,小于等于200
    Book.objects.filter(title__contains="python")  #title值中包含python的
    Book.objects.filter(title__icontains="python") #不区分大小写
    Book.objects.filter(title__startswith="py") #以什么开头,istartswith  不区分大小写
    Book.objects.filter(pub_date__year=2012)
    
    
    2.10 修改表记录
    Book.objects.filter(title__startswith="py").update(price=120), update只能是querset类型才能调用,model对象不能直接调用更新方法,所以使用get方法获取对象的时候是不能update的。
        此外,update()方法对于任何结果集(QuerySet)均有效,这意味着你可以同时更新多条记录update()方法会返回一个整型数值,表示受影响的记录条数。
    
        注意:<input type="date" class="form-control" id="book_pub_date" placeholder="出版日期" name="book_pub_date" value="{{ edit_obj.pub_date|date:'Y-m-d' }}">,type='date'的input标签,value的值必须是'Y-m-d'的格式,这个标签才能认识并被赋值,所以,要通过date过滤给它改变格式。
    
    
  • 相关阅读:
    模式识别之检索---Bag of visual word(词袋模型)
    模式识别之knn---KNN(k-nearest neighbor algorithm)--从原理到实现
    目标跟踪之meanshift---meanshift2
    图像处理之增强---图像模糊检测
    模式识别之非参数估计---非参估计中的核函数
    haproxy文章
    nginx 有关防盗链的设置
    haproxy 关闭ssl3
    navicat 在写存储过程的时候总是说语法错误
    开源的报表系统easyreport的部署
  • 原文地址:https://www.cnblogs.com/Doner/p/10911269.html
Copyright © 2011-2022 走看看