zoukankan      html  css  js  c++  java
  • Python:Day54 ORM

    Django项目中使用mysql

    DATABASES = {
    
        'default': {
    
            'ENGINE': 'django.db.backends.mysql', 
    
            'NAME': 'books',    #你的数据库名称
    
            'USER': 'root',   #你的数据库用户名
    
            'PASSWORD': '', #你的数据库密码
    
            'HOST': '', #你的数据库主机,留空默认为localhost
    
            'PORT': '3306', #你的数据库端口
    
        }
    
    }

    注意:

    NAME即数据库的名字,在mysql连接前该数据库必须已经创建,而上面的sqlite数据库下的db.sqlite3则是项目自动创建
    
    USER和PASSWORD分别是数据库的用户名和密码。
    
    设置完后,再启动我们的Django项目前,我们需要激活我们的mysql。
    
    然后,启动项目,会报错:no module named MySQLdb
    
    这是因为django默认你导入的驱动是MySQLdb,可是MySQLdb对于py3有很大问题,所以我们需要的驱动是PyMySQL
    
    所以,我们只需要找到项目名文件下的__init__,在里面写入:
    
    import pymysql
    pymysql.install_as_MySQLdb()
    
    问题解决!

    ORM:object relation mapping  对象关系映射,其实就是通过pyhon中的对象(由类实例化而来)和数据库中的表做一个映射。表中的一条记录其实就是一个实例对象。类就相当于是一个表头,在类中设置表头中的内容和字段类型。

    所写的类必须要继承models.Model这个类,不然Python不知道你这个类是用于操作数据库的。

    class book(models.Model):
        name=models.CharField(max_length=20)    #注意models后面跟的都是方法
        price=models.IntegerField()
        pub_date=models.DateField()

    已创建了表,然后追加一列:

    class book(models.Model):
        name=models.CharField(max_length=20)
        price=models.IntegerField()
        pub_date=models.DateField()
    
    之前创建了一张表,再给表增加下面一列内容:
    
        author=models.CharField(max_length=32,null=False)
    
    由于这是个追加的列,表里面可能已经存在数据,对于这些数据要怎么处理?所以当执行pyhon manage.py makemigrations的时候会有以下提示并让你选择:
    You are trying to add a non-nullable field 'author' to book without a default; we can't do that (the database needs something to populate existing ro
    ws).
    Please select a fix:
     1) Provide a one-off default now (will be set on all existing rows with a null value for this column)
     2) Quit, and let me add a default in models.py
    Select an option: 
    
    #选择1表未输入一个默认值,选择2表示退出,在models.py文件中的对应类中自己手动加入default="xx"的参数。

     单表操作

    表记录的添加:

    方式一:

        b=book(name="python",price=99,author="yuan",pub_date="2017-12-12")
        b.save()    #只有save了,这条数据才加进数据库

    方式二:

    book.objects.create(name="linux",price=78,author="oldboy",pub_date="2016-12-12")    #不用保存
      
    book.objects.create(**{"name"="linux","price"=78}) #如果从前端传过来的是字典,就可以直接这样使用

    表记录的修改:

      方式一:(建议使用这种方法) 

        book.objects.filter(author="yuan").update(price=999)  #update是QuerySet的方法

      方式二:由于这种方式,除了修改的字段,其它的也会重新赋值,效率比较低,所以不建议用

        b=book.objects.get(author="oldboy")  #get只能拿一条记录,拿0个或多个都会报错
        b.price=120
        b.save()

    表记录的删除 :

      book.objects.filter(author="oldboy").delete()  #delete也是QuerySet象的方法

    表记录的查询:    book_list = book.objects.filter(id=2)   

        book_list = book.objects.filter(id=2)    
       print
    (book_list) #<QuerySet [<book: book object (2)>]> print(type(book_list)) #<class 'django.db.models.query.QuerySet'> ret = book.objects.exclude(author="yuan") print(ret) #<QuerySet [<book: book object (2)>]> print(type(ret)) #<class 'django.db.models.query.QuerySet'> book_list=book.objects.all() #拿到的是QuerySet集合 print(book_list)
      #<QuerySet [<book: book object (1)>, <book: book object (2)>]>
      #如果在表里面定义了__str__方法,则返回的是<QuerySet [<book: python基础>, <book: linux运维>]>
    print(type(book_list)) #<class 'django.db.models.query.QuerySet'> print(book_list[0]) #book object (1) 如果在表里面定义了__str__方法,则返回的是 python基础 print(type(book_list[0])) #<class 'app01.models.book'> book_list = book.objects.all()[:3] book_list = book.objects.all()[::2] book_list = book.objects.all()[::-1] #可以对这个集合进行切片 ------------------------------------------------------------------------------------------------ #下面方法拿到的是一个实例对象 book_list = book.objects.get(id=2) print(book_list) #book object (2) 如果在表里面定义了__str__方法,则返回的是linux运维 print(type(book_list)) #<class 'app01.models.book'> book_list = book.objects.first() print(book_list) #book object (1) 如果在表里面定义了__str__方法,则返回的是 python基础 print(type(book_list)) #<class 'app01.models.book'> book_list = book.objects.last() ------------------------------------------------------------------------------------------------ ret = book.objects.filter(author="yuan").values("name","price") print(ret) #<QuerySet [{'price': 99, 'name': 'python基础'}]> print(type(ret)) #<class 'django.db.models.query.QuerySet'> ret = book.objects.filter(author="yuan").values_list("name","price") print(ret) #<QuerySet [('python基础', 99)]> print(type(ret)) #<class 'django.db.models.query.QuerySet'>

      注意:(1)values得到的是字典,而values_list得到的是元组。
         (2)虽然values获得结果的类型和filter,all等是一样的,但在显示内容上有所不同
         (3)QuerySet的形式是一个大的列表

    book_list=book.objects.all().values("name").distinct() book_count=book.objects.all().values("name").distinct().count() print(book_count)

    模糊查找:了不起的双下划线__

    双下划线其实是字段名的一种功能,如果是普通字段,则运用方法对字段进行过滤,如果是外键,双下划线可以链接到另一张表查询。

        book_list=book.objects.filter(id__lt=10, id__gt=1).values("name","price")
        book_list = book.objects.exclude(id__in=[11, 22, 33])
        book_list = book.objects.filter(id__range=[1, 2])
        book_list=book.objects.filter(name__icontains="p").values_list("name","price")  #不区分大小写
        book_list=book.objects.filter(name__contains="p").values_list("name","price")  #区分大小写
    
        #startswith,istartswith, endswith, iendswith,
  • 相关阅读:
    电容充放电时间计算
    常见AVX贴片钽电容封装尺寸、容值、耐压值的关系
    EPCS1结构及访问注意事项
    拜占庭将军问题
    photoshop的蒙板的作用
    linux系统脚本的常见启动顺序
    进制转换
    8>ORACLE四种关闭方式
    32位和64位操作系统的区别
    javascript 对大小写的问题
  • 原文地址:https://www.cnblogs.com/sq5288/p/9020748.html
Copyright © 2011-2022 走看看