Backend - ORM 的原生SQL

目录

一、基本认识

(一)意义

(二)原生SQL和SQL

(三)原生SQL的执行方式

1. 直接执行自定义SQL

2. 其他方式

二、SQL 写法

(一)原生SQL 中的表,最好用双引号包裹

(二)元组的形式

三、应用(postgreSQL查询)

(一)基本应用 

1. 连接postgreSQL数据库

2. 执行查询

(二)利用原生sql(raw方式)替换Q对象查询

1. where 1=0

2. CASE…THEN 1 ELSE 0 

3. CASE…END=1


一、基本认识

(一)意义

        针对数据库的查询效率,Django的ORM较低,原生SQL较高。

(二)原生SQL和SQL

        原生SQL和SQL是有区别的。

        原生SQL语句是Django的写法,不能放进数据库中直接查询。

        一般情况下使用ORM的filter、update等方式,方便代码统一调整管理。当ORM实在没有办法实现查询或提高查询效率,则用原生SQL。

(三)原生SQL的执行方式

1. 直接执行自定义SQL

        该方式无需模型,直接访问数据库。(直接执行update、insert等语句)

        利用 cursor 指针(游标)对象。

2. 其他方式

        raw 方式、extra 方式(基本没用)

二、SQL 写法

(一)原生SQL 中的表,最好用双引号包裹

# 正确写法
insert into "myApp_book" (card, name, author, btype, price, num) values %s # 错误写法(会提示该表不存在:relation "myapp_book" does not exist)
insert into myApp_book (card, name, author, btype, price, num) values %s

(二)元组的形式

列表包元组:

# 正确写法
[('2F0001',), ('2F0002',)]# 错误写法
[('2F0001'), ('2F0002')]

原因:元组里只有一个数据时,得用逗号结尾

三、应用(postgreSQL查询)

(一)基本应用 

1. 连接postgreSQL数据库

conn = psycopg2.connect(host='XX.XX.XX.XX',  # 主机地址dbname='BookDB',  # 数据库名称user='postgres',  # 用户名password='123456',  # 密码port='5432')  # 端口号

可参考另一篇文章:Backend - python 连接 & 操作 PostgreSQL DB(数据库)-CSDN博客

2. 执行查询

cur = conn.cursor()  # 创建游标对象
cur.execute('select card from "myApp_book" limit 10')  # 执行SQL语句
res_list = None
res_list = cur.fetchall()  # 获取记录值,结果是列表包元组:[('1F002', '数据结构怎么学'), ('1F001', '数据库原理')]
cols_list = [row[0] for row in cur.description]  # 获取栏位名称['card', 'name']
data_list = [dict(zip(cols_list, val_list)) for val_list in cur.fetchall()]  # 组装列表包字典:data_list [{'card': '1F002', 'name': '数据结构怎么学'}, {'card': '1F001', 'name': '数据库原理'}]

(二)利用原生sql(raw方式)替换Q对象查询

举例:查询 from_dict 字典中,存在于数据库记录所对应的id。

from myApp.models import model_book
class Query_DB:def __raw_sql(self):cond = str()for dictval in self.from_list:cond += (' OR CASE WHEN card = {} ' ' AND "name" =\'{}\' '' AND author =\'{}\' '' AND is_active = {} '' THEN 1 ELSE 0 END=1 ').format(dictval.get('Card'), dictval.get('Name'),  dictval.get('Author'), dictval.get('Status'))return 'SELECT id FROM {} WHERE 1=0 {}'.format('public.\"my_book\" ', cond)def query_data(self):self.from_list = [{'Card': '1F002', 'Name': '数据结构怎么学', 'Author': '萝卜干', 'Status': True}, {'card': '1F001', 'name': '数据库原理', 'Author': '小星星', 'Status': False}]id_qst = model_book.Book.objects.raw(self.__raw_sql)id_obj = [i for i in id_qst]  # id_obj=[<Book: Book object (22)>, <Book: Book object (23)>]query_data()

1. where 1=0

表示该条件为false,继续判定下一个条件。

2. CASE…THEN 1 ELSE 0 

表示该条件是否匹配,若匹配则返回1,否则为0.

3. CASE…END=1

表示该条件下获取的值是否为1,若为1,则结果为true,则查询出ID。

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

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

相关文章

面试算法-133-区间子数组个数

题目 给你一个整数数组 nums 和两个整数&#xff1a;left 及 right 。找出 nums 中连续、非空且其中最大元素在范围 [left, right] 内的子数组&#xff0c;并返回满足条件的子数组的个数。 生成的测试用例保证结果符合 32-bit 整数范围。 示例 1&#xff1a; 输入&#xff…

随机生成Long全范围数

随机生成Long全范围数 前言实现思路主要代码分区随机生成过程案例&#xff1a;随机生成100个数 朴素的比较总结 前言 使用自带的Random.nextLong()函数生成Long型的长整数&#xff0c;范围比较小&#xff0c;如下图。100个随机数没看见10以内的数字。所以考虑实现随机化生成大…

计算机网络:局域网的数据链路层

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

Android 高德地图

1.获取Key 进入高德开放平台控制台&#xff0c;创建一个新应用。在创建的应用上点击"添加key"按钮&#xff0c;在弹出的对话框中&#xff0c;依次输入key名称&#xff0c;选择服务平台为“Android平台”&#xff0c;输入发布版安全码 SHA1、以及 Package。 获取 S…

Windows系统基于WSL子系统的torchquantum安装记录GPU版本

子系统需要的环境&#xff1a; anaconda/miniconda、pip换源(清华源) 1.准备 torchquantum最新版本可以从github上找到&#xff0c;直接clone/下载整个project&#xff0c;查看环境要求&#xff0c;需要安装pytorch和tensorflow 新建一个conda环境&#xff0c;注意python最…

富文本编辑器Quill全套教程

Quill简介 Quill是一款现代的富文本编辑器&#xff0c;它以其API驱动的设计和对文本格式的深度理解而著称。与传统的富文本编辑器不同&#xff0c;Quill专注于以字符为中心&#xff0c;构建了一个直观且易于使用的API&#xff0c;使得开发者能够轻松地对文本进行格式化和编辑。…

Docker,anaconda环境的部署与迁移

功能上线将提上日程&#xff0c;但是如何将我windows环境下的程序放到linux服务器的测试环境跑通呢&#xff1f;这是我这整个清明假期将要解决的一件事&#xff0c;最蠢的办法就是看自己的环境下有哪些依赖&#xff0c;如何到服务器上一个一个下&#xff0c;但是首先这个方法很…

操作系统导论课后作业-第十七章答案

课程作业-第十七章&#xff1a; 17.1首先以标志flag -n 10 -H 0 -p BEST -s 0运行程序来产生一些随机的分配和空闲。你能预测malloc()/free()会返回什么吗&#xff1f;你可以在每次请求后猜测空闲列表的状态吗&#xff1f;随着时间的推移&#xff0c;你对空闲列表有什么发现&a…

深度学习模型--残差网络(ResNet)

AI大模型学习 方向一&#xff1a;AI大模型学习的理论基础 提示&#xff1a;探讨AI大模型学习的数学基础、算法原理以及模型架构设计等。可以深入分析各种经典的深度学习模型&#xff0c;如卷积神经网络&#xff08;CNN&#xff09;、循环神经网络&#xff08;RNN&#xff09;以…

【gurobi】AttributeError: Index out of range for attribute ‘X‘

解释代码错误“ early_time[r,v] max(0 , (arrival_t[r,v].X - data.Early_time[r])) File "src\gurobipy\var.pxi", line 125, in gurobipy.Var.__getattr__ File "src\gurobipy\var.pxi", line 153, in gurobipy.Var.getAttr File "src\gurobipy\a…

c++20协程详解(三)

前言 前面两节我们已经能够实现一个可用的协程框架了。但我们一定还想更深入的了解协程&#xff0c;于是我们就想尝试下能不能co_await一个协程。下面会涉及到部分模板编程的知识&#xff0c;主要包括&#xff08;模板偏特化&#xff0c;模板参数列表传值&#xff0c;模板函数…

谷歌(Google)技术面试——在线评估问题(三)

谷歌&#xff08;Google&#xff09;面试过程的第一步&#xff0c;你可能会收到一个在线评估链接。 评估有效期为 7 天&#xff0c;包含两个编码问题&#xff0c;需要在一小时内完成。 以下是一些供你练习的在线评估问题。 在本章结尾处&#xff0c;还提供了有关 Google 面试不…

进销存管理系统:食品批发零售迈向数字化未来-亿发

随着消费逐步复苏&#xff0c;食品批发零售行业也迎来了客流的回升&#xff0c;实体店重新焕发了生机。然而&#xff0c;随着数字化时代的来临&#xff0c;传统的食品批发零售企业面临着新的挑战和机遇。些企业正积极实施数字化转型&#xff0c;通过布局线上线下多业态的融合发…

设计模式:单例模式六种实现

单例模式有多种实现方式,每种方式都有其设计思想、优缺点以及适用的使用场景。以下是一些常见的单例实现方式: 1. 懒汉式(线程不安全) 设计思想 这种实现方式采用了类加载的懒加载机制来保证单例只在第一次使用时被创建。 实现代码 public class Singleton {private s…

分布式事务之Seata使用

分布式事务解决方案之Seata Seata的概念 Seata是阿里巴巴开源的分布式事务解决方案&#xff0c;致力于提供高性能和简单易用的分布式事务服务。Seata 提供了 AT、TCC、SAGA 和 XA 事务模式&#xff0c;为用户打造一站式的分布式解决方案。 Seata官网给出的架构示例如下&#…

ruoyi-nbcio-plus基于vue3的flowable流程设计器主界面升级修改

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 http://122.227.135.243:9666/ 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a…

C# 字节数组 byte[] 关于byte的小寄巧 以及Encoding和BitConverter

怎么读字节数组里面的内容 先是小错误 之 ToString然后是怎么办使用UTF-8编码使用ASCII编码使用其他编码未知编码注意 小demo下一个demo关于发送端的&#xff08;发送新行&#xff09;手搓bug编码之搓ascii encodeing评价为不如BitConverter一根 先是小错误 之 ToString 在C#中…

Docker客户端命令

一、在客户端输入 docker 命令,来查看 Docker 客户端的所有命令选项。 docker 使用 podman 模拟 Docker CLI 的功能,并创建 /etc/containers/nodocker 文件以静默消息。管理 pods、容器和镜像。 用法:podman [选项] [命令] 命令: attach 附加到一个正在运行的容器 auto-upd…

mysql故障排查

MySQL是目前企业最常见的数据库之一日常维护管理的过程中&#xff0c;会遇到很多故障汇总了常见的故障&#xff0c;MySQL默认配置无法满足高性能要求 一 MySQL逻辑架构图 客户端和连接服务核心服务功能存储擎层数据存储层 二 MySQL单实例常见故障 故障1 ERROR 2002 (HY000)…

深入理解npm常用命令

npm&#xff08;Node Package Manager&#xff09;是 Node.js 的包管理工具&#xff0c;用于管理 Node.js 应用程序的依赖包。除了安装、更新和卸载依赖包外&#xff0c;npm 还提供了许多其他功能&#xff0c;如初始化项目、运行脚本、查看依赖树等。本文将详细介绍一些常用的 …