Backend - ORM 的原生SQL

2024-04-04 09:20
文章标签 sql backend database 原生 orm

本文主要是介绍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。

这篇关于Backend - ORM 的原生SQL的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

Linux lvm实例之如何创建一个专用于MySQL数据存储的LVM卷组

《Linuxlvm实例之如何创建一个专用于MySQL数据存储的LVM卷组》:本文主要介绍使用Linux创建一个专用于MySQL数据存储的LVM卷组的实例,具有很好的参考价值,希望对大家有所帮助,... 目录在Centos 7上创建卷China编程组并配置mysql数据目录1. 检查现有磁盘2. 创建物理卷3. 创

MySQL 事务的概念及ACID属性和使用详解

《MySQL事务的概念及ACID属性和使用详解》MySQL通过多线程实现存储工作,因此在并发访问场景中,事务确保了数据操作的一致性和可靠性,下面通过本文给大家介绍MySQL事务的概念及ACID属性和... 目录一、什么是事务二、事务的属性及使用2.1 事务的 ACID 属性2.2 为什么存在事务2.3 事务

Mysql中的用户管理实践

《Mysql中的用户管理实践》:本文主要介绍Mysql中的用户管理实践,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录13. 用户管理13.1 用户 13.1.1 用户信息 13.1.2 创建用户 13.1.3 删除用户 13.1.4 修改用户

MySQL查看表的最后一个ID的常见方法

《MySQL查看表的最后一个ID的常见方法》在使用MySQL数据库时,我们经常会遇到需要查看表中最后一个id值的场景,无论是为了调试、数据分析还是其他用途,了解如何快速获取最后一个id都是非常实用的技... 目录背景介绍方法一:使用MAX()函数示例代码解释适用场景方法二:按id降序排序并取第一条示例代码解

Python+PyQt5实现MySQL数据库备份神器

《Python+PyQt5实现MySQL数据库备份神器》在数据库管理工作中,定期备份是确保数据安全的重要措施,本文将介绍如何使用Python+PyQt5开发一个高颜值,多功能的MySQL数据库备份工具... 目录概述功能特性核心功能矩阵特色功能界面展示主界面设计动态效果演示使用教程环境准备操作流程代码深度解

如何清理MySQL中的binlog问题

《如何清理MySQL中的binlog问题》:本文主要介绍清理MySQL中的binlog问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目http://www.chinasem.cn录清理mysql中的binlog1.查看binlog过期时间2. 修改binlog过期

MySQL基本查询示例总结

《MySQL基本查询示例总结》:本文主要介绍MySQL基本查询示例总结,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录Create插入替换Retrieve(读取)select(确定列)where条件(确定行)null查询order by语句li

查看MySql主从同步的偏移量方式

《查看MySql主从同步的偏移量方式》:本文主要介绍查看MySql主从同步的偏移量方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 1.mysql的主从同步方案mysqlphp为了在实现读写分离,主库写,从库读mysql的同步方案主要是通过从库读取主库的binl

MySQL表空间结构详解表空间到段页操作

《MySQL表空间结构详解表空间到段页操作》在MySQL架构和存储引擎专题中介绍了使用不同存储引擎创建表时生成的表空间数据文件,在本章节主要介绍使用InnoDB存储引擎创建表时生成的表空间数据文件,对... 目录️‍一、什么是表空间结构1.1 表空间与表空间文件的关系是什么?️‍二、用户数据在表空间中是怎么

Java JSQLParser解析SQL的使用指南

《JavaJSQLParser解析SQL的使用指南》JSQLParser是一个Java语言的SQL语句解析工具,可以将SQL语句解析成为Java类的层次结构,还支持改写SQL,下面我们就来看看它的具... 目录一、引言二、jsQLParser常见类2.1 Class Diagram2.2 Statement