Python 自动化(十七)ORM操作

news2024/9/25 7:18:58

ORM-查询操作

查询简介

  • 数据库的查询需要使用管理器对象 objects 进行

  • 通过 自定义模型类.objects 管理器调用查询方法

查询方法

all()方法
概念与理解
  • 用法:自定义模型类.objects.all()
  • 作用:查询自定义模型实体中所有的数据
  • 等同于 select * from table
  • 返回值:QuerySet 容器对象,内部存放 自定义模型类实例
实验:使用 all方法查询数据

实验:使用 values方法查询数据

实验:使用 values_list 方法查询数据

实验:使用 order_by 方法查询数据

解决方案:

实验:使用 filter 方法查询数据

实验:使用 exclude 方法查询数据

  • 打开 Django Shell 环境,导入模型类,使用 all 方法对数据进行查询

  • (testenv) [root@localhost mysite3]# python3 manage.py shell
    >>> from bookstore.models import Book
    >>> a1 = Book.objects.all()
    >>> a1
    <QuerySet [<Book: Book object (1)>, <Book: Book object (2)>, <Book: Book object (3)>, <Book: Book object (4)>, <Book: Book object (5)>]>
    >>> for book in a1:
    ...     print(book.title, book.pub)
    ... 
    Python 清华大学出版社
    Django 清华大学出版社
    JQuery 机械工业出版社
    Linux 机械工业出版社
    HTML5 清华大学出版社

    修改 Book类对象的显示内容,修改模型类中的 __str__ 方法

  • # file: bookstore/models.py
    class Book(models.Model):
        title = models.CharField("书名", max_length=50, default="", unique=True)
        pub = models.CharField("出版社", max_length=50, default="")
        price = models.DecimalField("定价", max_digits=7, decimal_places=2, default=0.0)
        market_price = models.DecimalField("零售价", max_digits=7, decimal_places=2, default=0.0)
    
        def __str__(self):  # 重写__str__方法
            return f"{self.title}, {self.pub}, {self.price}, {self.market_price}"
    
        class Meta:
            db_table = "book"

    重新打开 Django Shell 环境,导入模型类,使用 all 方法对数据进行查询

  • (testenv) [root@localhost mysite3]# python3 manage.py shell
    >>> from bookstore.models import Book
    >>> a1 = Book.objects.all()
    >>> a1
    <QuerySet [<Book: Python, 清华大学出版社, 20.00, 25.00>, <Book: Django, 清华大学出版社, 70.00, 75.00>, <Book: JQuery, 机械工业出版社, 90.00, 85.00>, <Book: , 65.00>, <Book: HTML5, 清华大学出版社, 90.00, 105.00>]>
    >>> for book in a1:
    ...     print(book)
    ... 
    Python, 清华大学出版社, 20.00, 25.00
    Django, 清华大学出版社, 70.00, 75.00
    JQuery, 机械工业出版社, 90.00, 85.00
    Linux, 机械工业出版社, 80.00, 65.00
    HTML5, 清华大学出版社, 90.00, 105.00
    values(列1, 列2, ……)
    概念与理解
  • 用法:自定义模型类.objects.values(列1, 列2, ……)
  • 作用:查询部分列的数据并返回
  • 等同于 select列1, 列2 from table
  • 返回值:QuerySet,返回查询结果容器,容器内存字典,每个字典代表一条数据
  • 打开 Django Shell 环境,导入模型类,使用 values 方法对数据进行查询

  • (testenv) [root@localhost mysite3]# python3 manage.py shell
    >>> from bookstore.models import Book
    >>> a2 = Book.objects.values("title", "pub")
    >>> a2
    <QuerySet [{'title': 'Python', 'pub': '清华大学出版社'}, {'title': 'Django', 'pub': '清华大学出版社'}, {'title': 'JQuery', 'pub': '机械工业出版社'}, {'title械工业出版社'}, {'title': 'HTML5', 'pub': '清华大学出版社'}]>
    >>> for book in a2:
    ...     print(book["title"], book["pub"])
    ... 
    Python 清华大学出版社
    Django 清华大学出版社
    JQuery 机械工业出版社
    Linux 机械工业出版社
    HTML5 清华大学出版社
    values_list(列1,列2, ……)
  • 概念与理解
  • 用法:自定义模型类.objects.values_list(列1, 列2, ……)
  • 作用:返回元组形式的查询结果
  • 等同于:select 列1, 列2 from xxx
  • 返回值:QuerySet容器对象,将查询出来的数据封装到元组中再封装到查询集合QuerySet中
  • 打开 Django Shell 环境,导入模型类,使用 values_list 方法对数据进行查询

  • (testenv) [root@localhost mysite3]# python3 manage.py shell
    >>> from bookstore.models import Book
    >>> a3 = Book.objects.values_list('title', 'pub')
    >>> a3
    <QuerySet [('Python', '清华大学出版社'), ('Django', '清华大学出版社'), ('JQuery', '机械工业出版社'), ('Linux', '机械工业出版社'), ('HTML5', '清华大学出版社')]>
    >>> for book in a3:
    ...     print(book[0], book[1])
    ... 
    Python 清华大学出版社
    Django 清华大学出版社
    JQuery 机械工业出版社
    Linux 机械工业出版社
    HTML5 清华大学出版社
    order_by()
    概念与理解
  • 用法:自定义模型类.objects.order_by(‘-列’, ‘列’)
  • 作用:与 all() 方法不同,它会用 SQL 语句的 ORDER BY 字句对查询结果根据某个字段进行选择性的排序
  • 说明:默认是按照升序排序,降序排序则需要在列前面加上’-’负号表示
  • 打开 Django Shell 环境,导入模型类,使用 order_by 方法对数据进行查询

  • >>> a4 = Book.objects.order_by("price")  # 默认升序排列
    >>> a4
    <QuerySet [<Book: Python, 清华大学出版社, 20.00, 25.00>, <Book: Django, 清华大学出版社, 70.00, 75.00>, <Book: Linux, 机械工业出版社, 80.00, 65.00>, <Book: J, 85.00>, <Book: HTML5, 清华大学出版社, 90.00, 105.00>]>
    >>> for book in a4:
    ...     print(book.title, book.price)
    ... 
    Python 20.00
    Django 70.00
    Linux 80.00
    JQuery 90.00
    HTML5 90.00
    >>> a5 = Book.objects.order_by("-price")  # 通过price价格降序排列
    >>> for book in a5:
    ...     print(book.title, book.price)
    ... 
    JQuery 90.00
    HTML5 90.00
    Linux 80.00
    Django 70.00
    Python 20.00
    >>> a6 = Book.objects.values("title").order_by("-price")  # 和其他查询方法连用
    >>> a6
    <QuerySet [{'title': 'JQuery'}, {'title': 'HTML5'}, {'title': 'Linux'}, {'title': 'Django'}, {'title': 'Python'}]>
    >>> a6.query
    <django.db.models.sql.query.Query object at 0x7ffbd8d32b20>
    >>> str(a6.query)  # 查询执行的 SQL 语句
    'SELECT `book`.`title` FROM `book` ORDER BY `book`.`price` DESC'
    练习:制作查看所有书籍页面

    需求:制作查看所有书籍页面

  • 视图函数: all_book

  • url: http://127.0.0.1:8000/bookstore/all_book

  • 编写视图函数 bookstore -> views.py

  • # file: bookstore/views.py
    from django.shortcuts import render
    from .models import Book
    
    def all_book(request):
        all_book = Book.objects.all()  # 查询所有图书
        return render(request, "bookstore/all_book.html", locals())

    编写指定模板文件 bookstore -> templates -> bookstore -> all_book.html

  • <!-- file: bookstore/templates/bookstore/all_book.html -->
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>图书首页</title>
    </head>
    <body>
    <table border="1px">
    {% for book in all_book %}
        <tr>
            <td>{{ book.id }}</td>
            <td>{{ book.title }}</td>
            <td>{{ book.pub }}</td>
            <td>{{ book.price }}</td>
            <td>{{ book.market_price }}</td>
            <td>
                <a href="">更新</a>
                <a href="">删除</a>
            </td>
        </tr>
    {% endfor %}
    </table>
    </body>
    </html>

    修改主路由文件 mysite3 -> urls.py

  • # file: mysite3/urls.py
    urlpatterns = [
        path('admin/', admin.site.urls),
        ###day03###
        path("test_static", views.test_static),
        path("music/", include("music.urls")),
        path("sport/", include("sport.urls")),
        path("news/", include("news.urls")),
        ###day04###
        path("bookstore/", include("bookstore.urls")),  # 添加主路由配置
    ]

    修改子路由文件 bookstore -> urls.py

  • # file: bookstore/urls.py
    from django.urls import path
    from . import views
    
    urlpatterns = [
        path("all_book", views.all_book),
    ]

    启动 Django 服务,在浏览器测试 http://127.0.0.1:8000/bookstore/all_book,查看模板是否渲染成功

  • 条件查询

    filter(条件)
    概念与理解
  • 用法:自定义 模型类.objects.filter(属性1 = 值1, 属性2 = 值2)
  • 作用:返回包含此条件的全部的数据集
  • 返回值:QuerySet 容器对象,内部存放自定义模型实例
  • 说明:当多个属性放在一起为 ’与’ 的关系
  • 打开 Django Shell 环境,导入模型类,使用 filter 方法对数据进行查询

  • (testenv) [root@localhost mysite3]# python3 manage.py shell
    >>> from bookstore.models import Book
    >>> b1 = Book.objects.filter(pub="中信出版社")  # 空结果集
    >>> b1
    <QuerySet []>
    >>> b2 = Book.objects.filter(pub="清华大学出版社")
    >>> b2
    <QuerySet [<Book: Python, 清华大学出版社, 20.00, 25.00>, <Book: Django, 清华大学出版社, 70.00, 75.00>, <Book: HTML5, 清华大学出版社, 90.00, 105.00>]>
    >>> str(b2.query)
    'SELECT `book`.`id`, `book`.`title`, `book`.`pub`, `book`.`price`, `book`.`market_price` FROM `book` WHERE `book`.`pub` = 清华大学出版社'
    >>> b3 = Book.objects.filter(pub="清华大学出版社", price=70)  # 多个条件是and关系
    >>> b3
    <QuerySet [<Book: Django, 清华大学出版社, 70.00, 75.00>]>
    >>> str(b3.query)  # 查询底层查询SQL语句
    'SELECT `book`.`id`, `book`.`title`, `book`.`pub`, `book`.`price`, `book`.`market_price` FROM `book` WHERE (`book`.`price` = 70 AND `book`.`pub` = 清华大学出版社)'
    exclude(条件)
    概念与理解
  • 用法:自定义模型类.objects.exclude(条件)
  • 作用:返回不包含此条件的全部数据集
  • 返回值:QuerySet容器对象,内部存放自定义模型实例
实验:使用 exclude 方法查询数据
  • 打开 Django Shell 环境,导入模型类,使用 exclude 方法对数据进行查询

    • >>> from bookstore.models import Book
      >>> books = Book.objects.exclude(pub="清华大学出版社", price=70)
      >>> for book in books:
      ...     print(book)
      ... 
      Python, 清华大学出版社, 20.00, 25.00
      JQuery, 机械工业出版社, 90.00, 85.00
      Linux, 机械工业出版社, 80.00, 65.00
      HTML5, 清华大学出版社, 90.00, 105.00

 get(条件)

概念与理解
  • 用法:自定义模型类.objects.get(条件)

  • 作用:返回满足条件的唯一一条数据

  • 说明:该方法只能返回一条数据

    • 查询结果多于一条数据则抛出 Model.MultipleObjectsReturned 异常
    • 查询结果如果没有数据则抛出 Model.DoesNotExists 异常
实验:使用 get 方法查询数据

常用的查询谓词
__exact等值匹配
__contains包含某个值
__startswith以 XXX 开始
__endswith以 XXX 结束
__gt大于某个值
__gte大于等于某个值
__lt小于某个值
__lte小于等于某个值
__in查找数据是否在指定范围内

  • 打开 Django Shell 环境,导入模型类,使用 get 方法对数据进行查询

  • >>> from bookstore.models import Book
    >>> b1 = Book.objects.get(title="Django")  # 拿到单条数据
    >>> b1
    <Book: Django, 清华大学出版社, 70.00, 75.00>
    >>> b2 = Book.objects.get(title="Django123")  # 数据不存在报错
    bookstore.models.Book.DoesNotExist: Book matching query does not exist.
    >>> books = Book.objects.get(pub="清华大学出版社")  # 返回多条数据报错
    bookstore.models.Book.MultipleObjectsReturned: get() returned more than one Book -- it returned 3!

    思考

    如何做非等值查询,即 where id > 1,尝试:Book.objects.filter(id>1) ?结果报错

  • >>> from bookstore.models import Book
    >>> Book.objects.filter(id>1)  # 报错
    Traceback (most recent call last):
      File "<console>", line 1, in <module>
    TypeError: '>' not supported between instances of 'builtin_function_or_method' and 'int'

    查询谓词

    理解与概念
  • 定义:做更灵活的条件查询时需要使用查询谓词
  • 说明:每一个查询谓词是一个独立的查询功能
实验:常用查询谓词演示
  • 打开 Django Shell 环境,导入模型类,使用常用的查询谓词对数据进行查询

  • >>> from bookstore.models import Book
    >>> b1 = Book.objects.filter(id__exact=1)  # __exact
    <QuerySet [<Book: Python, 清华大学出版社, 20.00, 25.00>]>
    >>> b2 = Book.objects.filter(title__contains='o')  # __contains
    >>> b2
    <QuerySet [<Book: Python, 清华大学出版社, 20.00, 25.00>, <Book: Django, 清华大学出版社, 70.00, 75.00>]>
    >>> str(b2.query)
    'SELECT `book`.`id`, `book`.`title`, `book`.`pub`, `book`.`price`, `book`.`market_price` FROM `book` WHERE `book`.`title` LIKE BINARY %o%'
    >>> b3 = Book.objects.filter(title__startswith="D")  # __startswith
    >>> b3
    <QuerySet [<Book: Django, 清华大学出版社, 70.00, 75.00>]>
    >>> str(b3.query)
    'SELECT `book`.`id`, `book`.`title`, `book`.`pub`, `book`.`price`, `book`.`market_price` FROM `book` WHERE `book`.`title` LIKE BINARY D%'
    >>> b4 = Book.objects.filter(price__gte=75)  # __gte
    >>> b4
    <QuerySet [<Book: JQuery, 机械工业出版社, 90.00, 85.00>, <Book: Linux, 机械工业出版社, 80.00, 65.00>, <Book: HTML5, 清华大学出版社, 90.00, 105.00>]>
    >>> str(b4.query)
    'SELECT `book`.`id`, `book`.`title`, `book`.`pub`, `book`.`price`, `book`.`market_price` FROM `book` WHERE `book`.`price` >= 75'
    >>> b5 = Book.objects.filter(title__in=["Python", "Ansible", "Django"])  # __in
    >>> b5
    <QuerySet [<Book: Python, 清华大学出版社, 20.00, 25.00>, <Book: Django, 清华大学出版社, 70.00, 75.00>]>
    >>> str(b5.query)
    'SELECT `book`.`id`, `book`.`title`, `book`.`pub`, `book`.`price`, `book`.`market_price` FROM `book` WHERE `book`.`title` IN (Python, Ansible, Django)'

    ORM-更新操作

    更新单个数据

  • 修改单个实体某些字段的步骤

    • 通过 get() 得到要修改的实体对象

    • 通过 对象.属性 的方式修改数据

    保存

    • 通过对象.save()保存数据
  • 批量更新数据

    直接调用 QuerySet 的 update(属性=值) 实现批量修改

    实验:更新数据

  • 打开 Django Shell 环境,导入模型类,测试单值更新以及批量更新操作

    (testenv) [root@localhost mysite3]# python3 manage.py shell
    >>> from bookstore.models import Book
    >>> b1 = Book.objects.get(id=1)
    >>> b1
    <Book: Python, 清华大学出版社, 20.00, 25.00>
    >>> b1.price = 22
    >>> b1.save()  # 单值修改
    >>> books = Book.objects.filter(pub="清华大学出版社")
    >>> books
    <QuerySet [<Book: Python, 清华大学出版社, 22.00, 25.00>, <Book: Django, 清华大学出版社, 70.00, 75.00>, <Book: HTML5, 清华大学出版社, 90.00, 105.00>]>
    >>> books.update(price=1)  # 批量修改
    3
    >>> books = Book.objects.filter(pub="清华大学出版社")
    >>> for book in books:
    ...     print(book.price)
    ... 
    1.00
    1.00
    1.00

    练习:制作更新书籍页面

    需求:

  • 点击查看所有书籍页面中的更新按钮进入更新页面
  • 视图函数:update_book
  • url:http://127.0.0.1:8000/bookstore/update_book/
  • 更新页中显示当前书籍信息,且能对定价和零售价进行修改

 

解决方案:

  • 修改指定模板文件 bookstore -> templates -> bookstore -> all_book.html

  • <!-- file: bookstore/templates/bookstore/all_book.html -->
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>图书首页</title>
    </head>
    <body>
    <table border="1px">
    {% for book in all_book %}
        <tr>
            <td>{{ book.id }}</td>
            <td>{{ book.title }}</td>
            <td>{{ book.pub }}</td>
            <td>{{ book.price }}</td>
            <td>{{ book.market_price }}</td>
            <td>
                <a href="/bookstore/update_book/{{ book.id }}">更新</a>
                <a href="">删除</a>
            </td>
        </tr>
    {% endfor %}
    </table>
    </body>
    </html>

    编写视图函数 bookstore -> views.py

  • from django.shortcuts import render
    from django.http.response import HttpResponse, HttpResponseRedirect
    from .models import Book
    
    def all_book(request):
        all_book = Book.objects.all()
        return render(request, "bookstore/all_book.html", locals())
    
    def update_book(request, book_id):
        # bookstore/update_book/1
        try:
            book = Book.objects.get(id=book_id)
        except Exception as e:
            print('--update book error is:', e)
            return HttpResponse('--The book is not existed')
        if request.method == 'GET':
            return render(request, 'bookstore/update_book.html', locals())
        elif request.method == 'POST':
            price = request.POST['price']
            market_price = request.POST['market_price']
            # 改
            book.price = price
            book.market_price = market_price
            # 保存
            book.save()
            return HttpResponseRedirect('/bookstore/all_book')

    编写指定模板文件 bookstore -> templates -> bookstore -> update_book.html

  • <!-- file: bookstore/templates/bookstore/update_book.html -->
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>更改书籍</title>
    </head>
    <body>
        <form action="/bookstore/update_book/{{ book.id }}" method="post">
            <p>
                title <input type="text" value="{{ book.title }}" disabled="disabled">
            </p>
            <p>
                pub <input type="text" value="{{ book.pub }}" disabled="disabled">
            </p>
            <p>
                price <input type="text" name="price" value="{{ book.price }}">
            </p>
            <p>
                market_price <input type="text" name="market_price" value="{{ book.market_price }}">
            </p>
            <p>
                <input type="submit" value="更新">
            </p>
        </form>
    </body>
    </html>

    修改子路由文件 bookstore -> urls.py

  • # file: bookstore/urls.py
    from django.urls import path
    from . import views
    
    urlpatterns = [
        path('all_book', views.all_book),
        path('update_book/<int:book_id>', views.update_book),
    ]

    启动 Django 服务,在浏览器测试 http://127.0.0.1:8000/bookstore/all_book,测试更新数据功能

 点击更新按钮

 

 

ORM-删除操作

单个数据删除

步骤
  • 查找查询结果对应的一个数据对象

  • 调用这个数据对象的 delete() 方法实现删除

 

批量删除

步骤
  • 查找查询结果集中满足条件的全部 QuerySet 查询集合对象

  • 调用查询集合对象的 delete() 方法实现删除

 

伪删除

  • 通常不会轻易在业务里把真正的数据删掉,取而代之的是做伪删除,即在表中添加一个布尔类型字段(例如is_active),默认是True;执行删除时,将欲删除数据的is_active字段设置为False
  • 注意:用伪删除时,确保显示数据的地方,均增加了is_active=True的过滤查询

练习:删除图书数据(伪删除)

需求:

  • 点击查看所有书籍页面中的删除;删除当前数据(伪删除)

  • 视图函数:delete_book

  • url: http://127.0.0.1:8000/bookstore/delete?book_id=xx

  • 注意:相关查询获取数据的地方,要过滤出活跃数据

  • 解决方案:

  • 在 Book 模型类中添加 is_active 字段,从而实现数据伪删除

  • class Book(models.Model):
        title = models.CharField("书名", max_length=50, default="", unique=True)
        pub = models.CharField("出版社", max_length=50, default="")
        price = models.DecimalField("定价", max_digits=7, decimal_places=2, default=0.0)
        market_price = models.DecimalField("零售价", max_digits=7, decimal_places=2, default=0.0)
        is_active = models.BooleanField("是否活跃", default=True)  # 添加字段

    实现数据迁移、

  • (testenv) [root@localhost mysite3]# python3 manage.py makemigrations
    (testenv) [root@localhost mysite3]# python3 manage.py migrate

    修改指定模板文件 bookstore -> templates -> bookstore -> all_book.html

  • <!-- file: bookstore/templates/bookstore/all_book.html -->
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>图书首页</title>
    </head>
    <body>
    <table border="1px">
    {% for book in all_book %}
        <tr>
            <td>{{ book.id }}</td>
            <td>{{ book.title }}</td>
            <td>{{ book.pub }}</td>
            <td>{{ book.price }}</td>
            <td>{{ book.market_price }}</td>
            <td>
                <a href="/bookstore/update_book/{{ book.id }}">更新</a>
                <a href="/bookstore/delete_book?book_id={{ book.id }}">删除</a>
            </td>
        </tr>
    {% endfor %}
    </table>
    </body>
    </html>

    编写视图函数 bookstore -> views.py

  • from django.shortcuts import render
    from django.http.response import HttpResponse, HttpResponseRedirect
    from .models import Book
    
    def all_book(request):
        # all_book = Book.objects.all()
        all_book = Book.objects.filter(is_active=True)  # 修改查询所有图书方式
        return render(request, "bookstore/all_book.html", locals())
    
    def update_book(request, book_id):
        # bookstore/update_book/1
        try:
            book = Book.objects.get(id=book_id, is_active=True)  # 过滤活跃图书
        except Exception as e:
            print('--update book error is:', e)
            return HttpResponse('--The book is not existed')
        if request.method == 'GET':
            return render(request, 'bookstore/update_book.html', locals())
        elif request.method == 'POST':
            price = request.POST['price']
            market_price = request.POST['market_price']
            # 改
            book.price = price
            book.market_price = market_price
            # 保存
            book.save()
            return HttpResponseRedirect('/bookstore/all_book')
    
    def delete_book(request):
        # 通过获取查询字符串 book_id 拿到要删除的book的id
        book_id = request.GET.get('book_id')
        if not book_id:
            return HttpResponse('---请求异常')
        try:
            book = Book.objects.get(id=book_id, is_active=True)
        except Exception as e:
            print('---delete book get error:', e)
            return HttpResponse('---The book id is error')
        # 将其is_active 改成False
        book.is_active = False
        book.save()
        # 302跳转至all_book
        return HttpResponseRedirect('/bookstore/all_book')

    修改子路由文件 bookstore -> urls.py

  • # file: bookstore/urls.py
    from django.urls import path
    from . import views
    
    urlpatterns = [
        path('all_book', views.all_book),
        path('update_book/<int:book_id>', views.update_book),
        path('delete_book', views.delete_book),
    ]

    启动 Django 服务,在浏览器测试 http://127.0.0.1:8000/bookstore/all_book,测试删除数据功能

 

 查询数据库,查看 is_active 状态是否修改

原生数据库操作

Django 也支持直接用 SQL 语句的方式通信数据库

  • 查询:自定义模型类.objects.raw()进行查询操作

  • 返回值:RawQuerySet集合对象【只支持基础操作,如循环】

  • 示例:

 

SQL 注入

概念与理解

使用原生语句时小心 SQL 注入

  • 定义:用户通过数据上传,将恶意的SQL语句提交给服务器,从而达到攻击效果

  • 案例:用户在登录时的密码框中输入 ‘1 ir 1=1’

  • 攻击结果:不需要密码可进行登录,窃取用户信息

实验:SQL 注入演示

  • 打开 Django Shell 环境,导入模型类,测试SQL注入以及预防操作

  • (testenv) [root@localhost mysite3]# python3 manage.py shell
    >>> from bookstore.models import Book
    >>> s1 = Book.objects.raw("select * from book where id=%s;" % ("1 or 1=1"))
    >>> s1  # SQL注入
    <RawQuerySet: select * from book where id=1 or 1=1;>
    >>> for item in s1:
    ...     print(item.title)
    ... 
    Python
    Django
    JQuery
    Linux
    HTML5
    >>> s2 = Book.objects.raw("select * from book where id=%s;", ["1 or 1=1"])
    >>> for item in s2:  # 防止SQL注入
    ...     print(item.title)
    ... 
    Python

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1227851.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第八部分:JSP

目录 JSP概述 8.1&#xff1a;什么是JSP&#xff0c;它有什么作用&#xff1f; 8.2&#xff1a;JSP的本质是什么&#xff1f; 8.3&#xff1a;JSP的三种语法 8.3.1&#xff1a;jsp头部的page指令 8.3.2&#xff1a;jsp中的常用脚本 ①声明脚本&#xff08;极少使用&#xf…

【Python仿真】基于EKF的传感器融合定位

基于EKF的传感器融合定位&#xff08;Python仿真&#xff09; 简述1. 背景介绍1.1. EKF扩展卡尔曼滤波1.1.1.概念1.1.2. 扩展卡尔曼滤波的主要步骤如下&#xff1a;1.1.3. 优、缺点 1.2. 航位推算1.3. 目前航位算法的使用通常与卡尔曼滤波相结合使用2. 分段代码 2.1. 导入需要的…

【Go入门】 Go如何使得Web工作

【Go入门】 Go如何使得Web工作 前面小节介绍了如何通过Go搭建一个Web服务&#xff0c;我们可以看到简单应用一个net/http包就方便的搭建起来了。那么Go在底层到底是怎么做的呢&#xff1f;万变不离其宗&#xff0c;Go的Web服务工作也离不开我们第一小节介绍的Web工作方式。 w…

Java --- JVM之垃圾回收相关算法

目录 一、垃圾标记算法 1.1、垃圾标记阶段&#xff1a;对象存活判断 1.2、引用计数算法 1.3、可达性分析算法 1.4、GC Roots 二、对象的finalization机制 2.1、生存还是死亡&#xff1f; 三、查看GC Roots 3.1、使用MAT查看 四、使用JProfiler分析OOM 五、清除阶段算…

系列五、怎么查看默认的垃圾收集器是哪个?

一、怎么查看默认的垃圾收集器是哪个 java -XX:PrintCommandLineFlags -version

SpringBoot项目连接linux服务器数据库两种解决方法(linux直接开放端口访问本机通过SSH协议访问,以mysql为例)

最近找个springboot脚手架重新熟悉一下springboot相关框架的东西&#xff0c;结果发现好像项目还不能直接像数据库GUI工具一样填几个SSH参数就可以了&#xff0c;于是就给他再整一下看看如何解决 linux开放3306&#xff08;可修改&#xff09;端口直接访问 此方法较为方便&am…

【数据结构&C++】二叉平衡搜索树-AVL树(25)

前言 大家好吖&#xff0c;欢迎来到 YY 滴C系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; 目录 一.AVL树的概念二.AVL树节点的定义(代码…

【嵌入式 – GD32开发实战指南(ARM版本)】第2部分 外设篇 - 第3章 温度传感器DS18B20

1 理论分析 1.1 DS18B20概述 DS18B20 是 DALLAS 最新单线数字温度传感器,新的"一线器件"体积更小、适用电压更宽、更经济。Dallas 半导体公司的数字化温度传感器 DS1820 是世界上第一片支持 "一线总线"接口的温度传感器。 DS18B20采用的单总线协议,也…

23.11.19日总结

经过昨天的中期答辩&#xff0c;其实可以看出来项目进度太慢了&#xff0c;现在是第十周&#xff0c;预计第十四周是终级答辩&#xff0c;在这段时间要把项目写完。 前端要加上一个未登录的拦截器&#xff0c;后端加上全局的异常处理。对于饿了么项目的商品建表&#xff0c;之前…

mybatis使用xml形式配置

以这个注解形式的查询代码为例 Select("select * from emp where name like concat(%,#{name},%) and gender #{gender} and entrydate between #{begin} and #{end} order by update_time desc ")public List<Emp> list(String name, Short gender, LocalDat…

SDUT OJ《算法分析与设计》搜索算法

A - 子集和问题 Description 子集和问题的一个实例为〈S,t〉。其中&#xff0c;S{ x1 &#xff0c; x2 &#xff0c;…&#xff0c;xn }是一个正整数的集合&#xff0c;c是一个正整数。子集和问题判定是否存在S的一个子集S1&#xff0c;使得&#xff1a; 。 试设计一个解子…

【Web】Ctfshow SSTI刷题记录1

目录 ①web361 362-无过滤 ②web363-过滤单双引号 ③web364-过滤单双引号和args ④web365-过滤中括号[]、单双引号、args ⑤web366-过滤单双引号、args、中括号[]、下划线 ⑦web367-过滤单双引号、args、中括号[]、下划线、os ⑧web368-过滤单双引号、args、中括号[]、下…

【Go入门】 Go搭建一个Web服务器

【Go入门】 Go搭建一个Web服务器 前面小节已经介绍了Web是基于http协议的一个服务&#xff0c;Go语言里面提供了一个完善的net/http包&#xff0c;通过http包可以很方便的搭建起来一个可以运行的Web服务。同时使用这个包能很简单地对Web的路由&#xff0c;静态文件&#xff0c…

卷积神经网络(VGG-16)海贼王人物识别

文章目录 前期工作1. 设置GPU&#xff08;如果使用的是CPU可以忽略这步&#xff09;我的环境&#xff1a; 2. 导入数据3. 查看数据 二、数据预处理1. 加载数据2. 可视化数据3. 再次检查数据4. 配置数据集5. 归一化 三、构建VGG-16网络1. 官方模型&#xff08;已打包好&#xff…

【win32_000】视频截图

PPT 编译器不会自己添加unicode定义 v 函数 WinMain int __clrcall WinMain([in] HINSTANCE hInstance ,//应用程序的当前实例的句柄。[in, optional] HINSTANCE hPrevInstance ,//应用程序上一个实例的句柄。 此参数始终为 NULL。[in] …

文心一言 VS 讯飞星火 VS chatgpt (138)-- 算法导论11.4 2题

二、用go语言&#xff0c;试写出HASH-DELETE 的伪代码;修改 HASH-INSERT&#xff0c;使之能处理特殊值DELETED。 文心一言&#xff1a; 首先&#xff0c;让我们定义一个基本的哈希表数据结构。这个结构将包括一个存储键值对的哈希表和一个存储已删除键值对的队列。我们可以用…

mac控制台命令小技巧

shigen日更文章的博客写手&#xff0c;擅长Java、python、vue、shell等编程语言和各种应用程序、脚本的开发。记录成长&#xff0c;分享认知&#xff0c;留住感动。 hello伙伴们&#xff0c;作为忠实的mac骨灰级别的粉丝&#xff0c;它真的给我带来了很多效率上的提升。那作为接…

mysql练习1

-- 1.查询出部门编号为BM01的所有员工 SELECT* FROMemp e WHEREe.deptno BM01; -- 2.所有销售人员的姓名、编号和部门编号。 SELECTe.empname,e.empno,e.deptno FROMemp e WHEREe.empstation "销售人员";-- 3.找出奖金高于工资的员工。 SELECT* FROMemp2 WHE…

日志维护库:loguru

在复杂的项目中&#xff0c;了解程序的运行状态变得至关重要。在这个过程中&#xff0c;日志记录&#xff08;logging&#xff09;成为我们追踪、调试和了解代码执行的不可或缺的工具。在python语言中常用logging日志库&#xff0c;但是logging日志库使用相对繁琐&#xff0c;在…

linux系统环境下mysql安装和基本命令学习

此篇文章为蓝桥云课--MySQL的学习记录 块引用部分为自己的实验部分&#xff0c;其余部分是课程自带的知识&#xff0c;链接如下&#xff1a; MySQL 基础课程_MySQL - 蓝桥云课 本课程为 SQL 基本语法及 MySQL 基本操作的实验&#xff0c;理论内容较少&#xff0c;动手实践多&am…