django原生sql
参考:http://www.jb51.net/article/128257.htm
coding=utf-8
from django.core.paginator import Paginator
def paginator(data_list, per_page, page_no):
"""封装Django分页"""
pages = Paginator(data_list, per_page)
# 防止超出页数
if not page_no > 0:
page_no = 1
if page_no > pages.num_pages:
page_no = pages.num_pages
p = pages.page(page_no) # 获取本页数据
data = dict() # 获取分页信息
data['count'] = pages.count
data['page_num'] = pages.num_pages
data['per_page'] = per_page
data['current'] = page_no
data['start_index'] = p.start_index() - 1
return p.object_list, page_no, data
class QueryWrapper(object):
"""查询集包装器。实现django Paginator需要的必要方法,实现和query一样使用Paginator分页"""
def init(self, sql, params=None, db="default"):
"""
:param sql: sql语句
:param params: sql语句的params参数
:param db: 数据库名称(Django配置)
"""
self.db = db
self.sql = sql
self.params = params
def count(self):
"""计算总页数"""
sql = """select count(*) from (%s) _count""" % self.sql
# sql封装方法请参考https://my.oschina.net/watcher/blog/1573503
return fetchone_sql((sql, self.params), db=self.db, flat=True) # 返回总页数
def getslice(self, x, y):
""" self.__getslice(x, y) = self[x:y]"""
sql = self.sql + ' LIMIT {start}, {num}'.format(start=x, num=y - x)
# sql封装方法请参考https://my.oschina.net/watcher/blog/1573503
return fetchall_to_dict((sql, self.params), db=self.db) # 字典列表形式返回
def demo_orm():
"""使用Django的ORM分页"""
# 示例:查询status=1的用户分页,每页10条,取第2页数据(假设数据量足够)
status = 1
per_page = 10
page_no = 2
# 使用Django的ORM
from django.contrib.auth.models import User
query = User.objects.filter(status=status).values("id", "username", "first_name")
one_page_data_list, page_no, page_data = paginator(query, per_page, page_no)
# one_page_data_list 即为第二页数据,例如:[{"id": 1, "username": "111", "first_name": "aaa"}]
print one_page_data_list
def demo_raw():
"""使用原生sql实现相同分页"""
# 示例:查询status=1的用户分页,每页10条,取第2页数据(假设数据量足够)
status = 1
per_page = 10
page_no = 2
sql = "select id, username, first_name from auth_user where status=%(status)s"
params = {"status": status} # 使用params防止sql注入
query = QueryWrapper(sql, params, "default")
one_page_data_list, page_no, page_data = paginator(query, per_page, page_no)
# one_page_data_list 同ORM获取数据一样
print one_page_data_list
if name == "main":
demo_orm()
demo_raw()
django原生sql的更多相关文章
- django原生sql查询如何返回字典格式
django原生sql查询,默认返回的是元祖.如果想返回字典格式,需要自行封装: http://www.360doc.com/content/17/0802/11/9200790_676042880. ...
- 18.Django原生SQL语句查询返回字典
在django中执行自定义语句的时候,返回的结果是一个tuple ,并我不是我所期望的dict.当结果是tuple 时,如果要取得数据,必须知道对应数据在结果集中的序号,用序号的方式去得到值. 如果是 ...
- django -----原生SQL语句查询与前端数据传递?
view.py中 import MySQL def request_data(request): if request.method == "GET": conn = MySQLd ...
- django中使用原生sql
在Django中使用原生Sql主要有以下几种方式: 一:extra:结果集修改器,一种提供额外查询参数的机制 二:raw:执行原始sql并返回模型实例 三:直接执行自定义Sql ( 这种方式完全不依赖 ...
- Django ORM 使用原生 SQL
使用原生sql的 方法 : raw # row方法:(掺杂着原生sql和orm来执行的操作) res = CookBook.objects.raw('select id as nid from epo ...
- Django中的ORM相关操作:F查询,Q查询,事物,ORM执行原生SQL
一 F查询与Q查询: 1 . F查询: 在上面所有的例子中,我们构造的过滤器都只是将字段值与某个常量做比较.如果我们要对两个字段的值做比较,那该怎么做呢? Django 提供 F() 来做这样的 ...
- Django中使用mysql数据库并使用原生sql语句操作
Django自身默认使用sqlite3这个轻量级的数据库,但是当我们开发网站时,sqlite3就没有mysql好,sqlite3适合一些手机上开发使用的数据库. 准备的软件mysql数据库,版本5.7 ...
- django系列5.4--ORM中执行原生SQL语句, Python脚本中调用django环境
ORM执行原生sql语句 在模型查询API不够用的情况下,我们还可以使用原始的SQL语句进行查询. Django 提供两种方法使用原始SQL进行查询:一种是使用raw()方法,进行原始SQL查询并返回 ...
- Django进阶Model篇008 - 使用原生sql
注意:使用原生sql的方式主要目的是解决一些很复杂的sql不能用ORM的方式写出的问题. 一.extra:结果集修改器-一种提供额外查询参数的机制 二.执行原始sql并返回模型实例 三.直接执行自定义 ...
随机推荐
- Android Spiner实现Key-Value
原网址:http://www.eoeandroid.com/thread-29687-1-1.html?_dsign=02d5cd6a 学习到的方法,直接上代码了: 1.定义一个class publi ...
- 【习题集锦】全国青少年NOIP培训教材 ISBN 978-7-305-04246-1
目录 第一章 回溯法 找路径问题 递归代码: procedure find(k:integer); {找第K步的可能性} begin if 到目的地 {表示一条路已找出} then begin 输出路 ...
- deeplearning.ai课程学习(1)
本系列主要是我对吴恩达的deeplearning.ai课程的理解和记录,完整的课程笔记已经有很多了,因此只记录我认为重要的东西和自己的一些理解. 第一门课 神经网络和深度学习(Neural Netwo ...
- php处理三级分类数据
<?php // 链接数据库 $link = mysqli_connect('localhost','root','root'); if($link == null){ exit; } mysq ...
- get? post? put? delete? head? trace? options? http请求方法
http1.1协议里面定义了八种请求方法: get:用作获取,读取数据 post:向指定的资源提交数据 put:更新,向指定的资源上传一个内容,比如说:更新一个用户的头像或者替换掉已有的一个视频 de ...
- 浅析Python中的main函数
Python作为一门较为灵活的解释型脚本语言,其中定义的main()函数只有当该Python脚本直接作为执行程序时才会执行: 当该python脚本被作为模块(module)引入(import)时,其中 ...
- php实现base64图片上传方式实例代码
<?php /** * base64图片上传 * @param $base64_img * @return array */ header("content-type:text/htm ...
- 【SVN】SVN服务器的本地搭建和使用
Subversion是优秀的版本控制工具,其具体的的优点和详细介绍,这里就不再多说. 首先来下载和搭建SVN服务器. 现在Subversion已经迁移到apache网站上了,下载地址: http:// ...
- Spark分布式执行原理
Spark分布式执行原理 让代码分布式运行是所有分布式计算框架需要解决的最基本的问题. Spark是大数据领域中相当火热的计算框架,在大数据分析领域有一统江湖的趋势,网上对于Spark源码分析的文章有 ...
- Java语言常用的运算符和表达式详解
Java提供了丰富的运算符,如算术运算符.关系运算符.逻辑运算符.位运算符等等.Java的表达式就是用运算符连接起来的符合Java规则的式子.运算符的优先级决定了表达式中运算执行的先后顺序.在编写程序 ...