精华内容
下载资源
问答
  • django 使用原生sql

    千次阅读 2018-08-28 10:51:11
    Django中查询筛选数据时,大多数是使用封装好的orm,其中有一些较为复杂的sql语句很难使用orm实现,因此在此引入Django中原生sql的使用方法 在Django中使用原生Sql主要有以下三种方法: 一:extra:结果集修改器,...

    Django中查询筛选数据时,大多数是使用封装好的orm,其中有一些较为复杂的sql语句很难使用orm实现,因此在此引入Django中原生sql的使用方法

    在Django中使用原生Sql主要有以下三种方法:
    一:extra:结果集修改器,一种提供额外查询参数的机制
    二:raw:执行原始sql并返回模型实例
    三:直接执行自定义Sql

    下面列举django文档中的例子

    from django.db import models
    
    class Book(models.Model):
        name = models.CharField('书名')
        price = models.IntegerField('价钱')
        publish = models.CharField('出版社')
        create_time = models.DateTimeField('上线日期'

    1.extra:结果集修改器,是吗一种提供额外查询参数的机制

    books= Book.objects.filter(publish='清华出版社').extra(where=['price>50'])

    此方法适合用于orm难以实现的某个筛选条件,将这个条件单独选出,使用原生sql进行筛选。此方法也依然主要依靠与orm
    谨慎使用,防止sql注入问题

    2.raw:执行原始sql并返回模型实例

    raw() 自动将查询中的字段映射到模型上的字段。

    books = Book.objects.raw('select * from book where publish="清华出版社"')

    或者,您可以使用translations参数to 将查询中的字段映射到模型字段 raw()。这是一个字典,将查询中字段的名称映射到模型上字段的名称。例如,上面的查询也可以写成:

    name_map = {'user_name': 'name', 'book_price': 'price', 'pls': 'publish', 'time': 'create_time'}
    Book.objects.raw('SELECT * FROM book', translations=name_map)

    此方法在执行完原生sql后,返回一个orm的实例

    3.直接执行自定义Sql

    from django.db import connection                                              # django封装好的方法
    cursor=connection.cursor()                                                    # 建立游标                
    
    cursor.execute("insert into book(name) values('小王子')")                        #插入操作
    
    cursor.execute('update book set name='梦里花落知多少' where name='撒哈拉的故事'') #更新操作
    
    cursor.execute('delete from book where name='小王子'')                           #删除操作
    
    cursor.execute('select * from book')                                          #查询操作
    raw = cursor.fetchone()                                                       #读取一条
    raw_list = cursor.fetchall()                                                  #读取所有,返回list
    cursor.close()  #关闭游标

    另一种更好的方法,采用django文档种的语句

    rom django.db import connection
    
    def my_custom_sql(self):
        with connection.cursor() as cursor:                        # with语句相当与cursor= connection.cursor() 和 cursor.close(),简化了语句
            cursor.execute("UPDATE bar SET foo = 1 WHERE baz = %s", [self.baz])
            cursor.execute("SELECT foo FROM bar WHERE baz = %s", [self.baz])
            row = cursor.fetchone()
    
        return row

    如果您使用多个数据库,则可以使用django.db.connections获取特定数据库的连接(和游标)。django.db.connections是一个类似字典的对象,允许您使用其别名检索特定连接:

    from django.db import connections
    with connections['my_db_alias'].cursor() as cursor:
        # Your code here...

    此方法是真正的完全抛弃orm,直接使用原生sql,django中也有封装好的connection方法使用,只要sql语句使用流畅,此方法也比较方便。

    默认情况下,Python DB API将返回没有字段名称的结果,这意味着您最终会得到一个list值,而不是一个dict。在较小的性能和内存成本下,您可以使用以下内容返回结果dict:

    def dictfetchall(cursor):
        "Return all rows from a cursor as a dict"
        columns = [col[0] for col in cursor.description]
        return [
            dict(zip(columns, row))
            for row in cursor.fetchall()
        ]
    
     # 结果例子
     # [{'parent_id': None, 'id': 54360982}, {'parent_id': None, 'id': 54360880}]

    另一种选择是使用collections.namedtuple()Python标准库。A namedtuple是一个类似元组的对象,其字段可通过属性查找访问; 它也是可索引和可​​迭代的。结果是不可变的,可以通过字段名称或索引访问,这可能很有用:

    from collections import namedtuple
    
    def namedtuplefetchall(cursor):
        "Return all rows from a cursor as a namedtuple"
        desc = cursor.description
        nt_result = namedtuple('Result', [col[0] for col in desc])
        return [nt_result(*row) for row in cursor.fetchall()]
    
    # 结果例子
    # [Result(id=54360982, parent_id=None), Result(id=54360880, parent_id=None)]
    展开全文
  • django基于sql的中文全文检索    由于项目需求的原因,需要将检索结果通过提取出来转换为json的方式返回给中间层或前端。在笔记的检索中,如果通过检索所有的笔记,并再通过user_id去过滤数据时,会请求到很多...

    django基于sql的中文全文检索

       由于项目需求的原因,需要将检索结果通过提取出来转换为json的方式返回给中间层或前端。在笔记的检索中,如果通过检索所有的笔记,并再通过user_id去过滤数据时,会请求到很多不必要的数据,这并不是良好的设计,再加上项目需求中需要能够使用检索表达式来完成比较复杂的请求,于是考虑使用sql来进行功能的补充。
       具体的数据库设计等,见我的另一篇博客 https://blog.csdn.net/qq_37748146/article/details/90723891
       在这里需要满足基本的检索式需求(能够满足简单的布尔检索并进行拓展,即能够实现AND,OR查询,并可在OR关系的元素中使用AND查询)。
       注意这里使用空格来分隔查询关键词,即AND查询会将连续出现的且不为or的元素作为要同时查询的关键词。
       下面为几个查询例子

    • 'A B ':满足A和B同时出现
    • 'A or B ':满足A出现或者B出现
    • 'A or B C ':满足出现A或者满足B和C同时出现
    • 'A B or C D ':满足A和B同时出现或者满足C和D同时出现

    编辑note/my_searchview.py

    def search_keywords(request):
        if request.method == 'POST':  # 当提交表单时
            keywords = []
            user_id = request.POST.get('user_id')
            keyword = request.POST.get('keywords')
            keyword1 = keyword.split('or') #  用来分隔需要满足AND查询的子查询集合
            for i in range(len(keyword1)):
                keyword2 = keyword1[i].split()
                keywords.append(keyword2)
            json_data = []
            connection = sqlite3.connect('/home/projects/inspiration_notebook/db.sqlite3') # 服务器项目数据库文件
            cursor = connection.cursor()
            sql_list = []
            for i in range(len(keywords)):
                sql = "select * from note_note where user = " + str(user_id) + " and " \       #首先指定查询的用户
                      "( "                                                  	
                for j in range(len(keywords[i])):
                    sql_ = " (title like '%" + keywords[i][j] + \
                           "%' or notebook like '%" + keywords[i][j] + \
                           "%' or tag like '%" + keywords[i][j] + \
                           "%' or content like '%" + keywords[i][j] + "%' )"
                    sql_list.append(sql_)		#这里拼接sql,例如查询'A B',需要满足A与B同时出现
    
                for m in range(len(sql_list)):
                    sql += sql_list[m] + 'or' if m != len(sql_list) - 1 else sql_list[m]
                sql += ")"                      #这里拼接sql,满足通过or分隔的多组查询关键词
                result = cursor.execute(sql).fetchall()
                for i in range(len(result)):
                    note_data = {
                         'title': result[i][1],
                        'user_id': result[i][2],
                        'content': result[i][3],
                        'tag': result[i][4],
                        'notebook': result[i][5],
                    }
                    if not note_data in json_data:
                        json_data.append(note_data)
            print(json_data)
            code = 200
            msg = 'successful'
            result = {"code": code, "msg": msg, "data": json_data}
            # 关键步骤:转化为json格式,并返回给前端
            return HttpResponse(json.dumps(result, ensure_ascii=False), content_type="application/json,charset=utf-8")
        else:
            result = {"code": 414, "msg": 'failed', "data": '请使用POST请求'}    #注意,这里的code指的并不是http返回码,而是项目自身规定的返回码。
            return HttpResponse(json.dumps(result), content_type="application/json")
    
    

    这样就可以得到某一个用户下满足需求的笔记了,减少了很多不必要的变量。并将json形式的数据返回给中间层或前端。

    展开全文
  • 执行原生SQL: 1 from django.db import connection, connections 2 cursor = connection.cursor() 3 cursor.execute( 4 """select * from tb where nid=%s""",[user....

    执行原生SQL:

    1         from django.db import connection, connections
    2         cursor = connection.cursor()
    3         cursor.execute(
    4              """select * from tb where nid=%s""",[user.nid, ])
    5         result = cursor.fetchall()
    原生SQL

     赋值放在第二个参数,防止SQL注入

    对于时间进行格式化:

    1. SQLite时间戳---->日期格式:
    1 strftime("%Y-%m-01",ctime)

      转换回时间戳:

    strftime('%s',strftime("%Y-%m-01",ctime))

      2.MySQ时间戳---->日期格式:

    1 date_format(NOW(),'%Y-%m-%d %H:%i:%s')

    MYSQL日期--->时间戳:

    UNIX_TIMESTAMP('2006-11-04 12:23:00');

    --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    JS时间戳+new Date()

    JS日期格式new Date()
     

     

    转载于:https://www.cnblogs.com/Neroi/p/10565244.html

    展开全文
  • 所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意的)SQL命令注入到后台数据库引擎执行的能力...

    所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意的)SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的,这类表单特别容易受到SQL注入式攻击。

    场景:

    比如现在数据库中有一个front_user表,表结构如下:

    class User(models.Model):
        telephone = models.CharField(max_length=11)
        username = models.CharField(max_length=100)
        password = models.CharField(max_length=100)
    

    然后我们使用原生sql语句实现以下需求:

    实现一个根据用户id获取用户详情的视图。示例代码如下:

    def index(request):
        user_id = request.GET.get('user_id')
        cursor = connection.cursor()
        cursor.execute("select id,username from front_user where id=%s" % user_id)
        rows = cursor.fetchall()
        for row in rows:
            print(row)
        return HttpResponse('success')
    

    这样表面上看起来没有问题。但是如果用户传的user_id是等于1 or 1=1,那么以上拼接后的sql语句为:

    select id,username from front_user where id=1 or 1=1
    

    以上sql语句的条件是id=1 or 1=1,只要id=1或者是1=1两个有一个成立,那么整个条件就成立。毫无疑问1=1是肯定成立的。因此执行完以上sql语句后,会将front_user表中所有的数据都提取出来。

    实现一个根据用户的username提取用户的视图。示例代码如下:

    def index(request):
        username = request.GET.get('username')
        cursor = connection.cursor()
        cursor.execute("select id,username from front_user where username='%s'" % username)
        rows = cursor.fetchall()
        for row in rows:
            print(row)
        return HttpResponse('success')
    

    这样表面上看起来也没有问题。但是如果用户传的username是zhiliao’ or '1=1,那么以上拼接后的sql语句为:

    select id,username from front_user where username='zhiliao' or '1=1'
    

    以上sql语句的条件是username='zhiliao’或者是一个字符串,毫无疑问,字符串的判断是肯定成立的。因此会将front_user表中所有的数据都提取出来。
    在这里插入图片描述
    sql注入防御:

    以上便是sql注入的原理。他通过传递一些恶意的参数来破坏原有的sql语句以便达到自己的目的。当然sql注入远远没有这么简单,我们现在讲到的只是冰山一角。那么如何防御sql注入呢?归类起来主要有以下几点:

    永远不要信任用户的输入。对用户的输入进行校验,可以通过正则表达式,或限制长度;对单引号和 双"-"进行转换等。

    永远不要使用动态拼装sql,可以使用参数化的sql或者直接使用存储过程进行数据查询存取。比如:

    def index(request):
        user_id = "1 or 1=1"
        cursor = connection.cursor()
        cursor.execute("select id,username from front_user where id=%s",(user_id,))
        rows = cursor.fetchall()
        for row in rows:
            print(row)
        return HttpResponse('success')
    

    永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。

    不要把机密信息直接存放,加密或者hash掉密码和敏感的信息。

    应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装。

    在Django中如何防御sql注入:

    使用ORM来做数据的增删改查。因为ORM使用的是参数化的形式执行sql语句的。

    如果万一要执行原生sql语句,那么建议不要拼接url,而是使用参数化的形式。更多干货内容,欢迎关注公众号:知了python
    在这里插入图片描述

    展开全文
  • Django使用原生SQL语句的两种方式

    千次阅读 2020-01-12 21:53:34
    此方法接受原始SQL查询,执行该查询,然后返回django.db.models.query.RawQuerySet实例。可以像普通QuerySet一样迭代此RawQuerySet实例以提供对象实例。 例如: class Person(models.Model): fi...
  • 本篇文章是基于django+scrapy+mysql搭建的一个简易的微博热点提取系统,其中使用了scrapy-djangoitem将scrapy爬取到的数据item和django框架的model关联起来,从而直接存入到数据库,减少了在scrapy编写mysql连接和...
  • Django

    万次阅读 多人点赞 2019-09-02 15:36:17
    Django 一,简介 Django是一个开放源代码的Web应用框架,由Python写成。采用了MTV的框架模式,即模型M,视图V和模版T。它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的,即是CMS(内容管理...
  • 还记得我们上次做的一个高潮提取器吗:Python制作音乐高潮提取器。今天我们来把这个高潮提取...因此我们将用Django来完成这个网站。不过由于我不想让文章篇幅变得冗长,我们将分为两部分来讲解,第一部分是建造一个简单
  • django

    2019-11-18 22:31:00
    Django 概述 python有许多不同的WEB框架,django是最具有代表性的一位,许多成功的网站和APP都基于django django是一个开源的web应用框架,由python编写 django采用了MVC的软件设计模式,既模型M,视图V,和控制器C ...
  • SQL注入 所谓SQL注入,就是通过把SQL命令插入到表单中或页面请求的查询字符串中,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意的)SQL命令注入到后台数据库引擎执行的能力,它...
  • Django框架中models的DateTimeField类型在MySQL数据库中插入的时间格式是“2019-02-16 10:25:04.186496”。 使用普通的ORM查询语句,输出的DateTimeField字段是“datetime.datetime(2019, 2, 16, 10, 8, 44, 642364)...
  • Django框架

    2021-04-03 16:51:43
    现状Django的安装创建Django项目创建项目的指令Django项目的目录结构`settings.py` 文件介绍URL 介绍URL定义Django如何处理一个URL对应的请求视图函数(view)Django 路由配置path() 函数path转换器re_path()函数HTTP...
  • Django Messages

    2020-09-25 17:11:13
    消息框架允许临时将消息存储在请求中,并在其后的下一个请求中提取并显示。每个消息都会带有一个特定消息级别的标签以表示优先级。 消息存储 消息框架支持使用不同的后端存储来存储临时消息,Djangodjango.contrib...
  • Django项目实践1 - 创建Django项目

    万次阅读 2014-08-31 21:58:47
    Introduction Django简介 Python下有许多款不同的 Web 框架。Django是重量级选手中最有代表性的一位。许多成功的网站和APP都基于DjangoDjango是一个开放源代码的Web应用框架,由Python写成。Django遵守BSD版权,...
  • 笔记主要基于官方文档,从中提取要点和记录笔记,关键处包含了官方文档链接。详见官方文档。 官方文档:Django documentation 博客推荐:Django2.2教程 官方文档模型层:The model layer 模型层 目录 1.关系 ...
  • django基础

    2018-10-24 21:09:19
    mkvirtualenv django_py3_1.11 -p python3 pip install django==1.11.11 创建项目 django-admin startproject 工程名称 settings.py 是项目的整体配置文件。 INSTALLED_APPS项保存了工程中已经注册安装的子应用’...
  • 创建数据库 1、在mysql中创建一个库 ku 打开命令行登录mysql mysql -u root -p create database ku charset='utf8'; ...找到要存放项目的文件夹shift+右键 在此处打开命令行 激活 虚拟环境 ...创建LibraryKu项目...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,331
精华内容 1,732
关键字:

djangosql提取