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

相关文章

MySQL的JDBC编程详解

《MySQL的JDBC编程详解》:本文主要介绍MySQL的JDBC编程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言一、前置知识1. 引入依赖2. 认识 url二、JDBC 操作流程1. JDBC 的写操作2. JDBC 的读操作总结前言本文介绍了mysq

java.sql.SQLTransientConnectionException连接超时异常原因及解决方案

《java.sql.SQLTransientConnectionException连接超时异常原因及解决方案》:本文主要介绍java.sql.SQLTransientConnectionExcep... 目录一、引言二、异常信息分析三、可能的原因3.1 连接池配置不合理3.2 数据库负载过高3.3 连接泄漏

Linux下MySQL数据库定时备份脚本与Crontab配置教学

《Linux下MySQL数据库定时备份脚本与Crontab配置教学》在生产环境中,数据库是核心资产之一,定期备份数据库可以有效防止意外数据丢失,本文将分享一份MySQL定时备份脚本,并讲解如何通过cr... 目录备份脚本详解脚本功能说明授权与可执行权限使用 Crontab 定时执行编辑 Crontab添加定

MySQL中On duplicate key update的实现示例

《MySQL中Onduplicatekeyupdate的实现示例》ONDUPLICATEKEYUPDATE是一种MySQL的语法,它在插入新数据时,如果遇到唯一键冲突,则会执行更新操作,而不是抛... 目录1/ ON DUPLICATE KEY UPDATE的简介2/ ON DUPLICATE KEY UP

MySQL分库分表的实践示例

《MySQL分库分表的实践示例》MySQL分库分表适用于数据量大或并发压力高的场景,核心技术包括水平/垂直分片和分库,需应对分布式事务、跨库查询等挑战,通过中间件和解决方案实现,最佳实践为合理策略、备... 目录一、分库分表的触发条件1.1 数据量阈值1.2 并发压力二、分库分表的核心技术模块2.1 水平分

Python与MySQL实现数据库实时同步的详细步骤

《Python与MySQL实现数据库实时同步的详细步骤》在日常开发中,数据同步是一项常见的需求,本篇文章将使用Python和MySQL来实现数据库实时同步,我们将围绕数据变更捕获、数据处理和数据写入这... 目录前言摘要概述:数据同步方案1. 基本思路2. mysql Binlog 简介实现步骤与代码示例1

Python ORM神器之SQLAlchemy基本使用完全指南

《PythonORM神器之SQLAlchemy基本使用完全指南》SQLAlchemy是Python主流ORM框架,通过对象化方式简化数据库操作,支持多数据库,提供引擎、会话、模型等核心组件,实现事务... 目录一、什么是SQLAlchemy?二、安装SQLAlchemy三、核心概念1. Engine(引擎)

使用shardingsphere实现mysql数据库分片方式

《使用shardingsphere实现mysql数据库分片方式》本文介绍如何使用ShardingSphere-JDBC在SpringBoot中实现MySQL水平分库,涵盖分片策略、路由算法及零侵入配置... 目录一、ShardingSphere 简介1.1 对比1.2 核心概念1.3 Sharding-Sp

MySQL 表空却 ibd 文件过大的问题及解决方法

《MySQL表空却ibd文件过大的问题及解决方法》本文给大家介绍MySQL表空却ibd文件过大的问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考... 目录一、问题背景:表空却 “吃满” 磁盘的怪事二、问题复现:一步步编程还原异常场景1. 准备测试源表与数据

Mac电脑如何通过 IntelliJ IDEA 远程连接 MySQL

《Mac电脑如何通过IntelliJIDEA远程连接MySQL》本文详解Mac通过IntelliJIDEA远程连接MySQL的步骤,本文通过图文并茂的形式给大家介绍的非常详细,感兴趣的朋友跟... 目录MAC电脑通过 IntelliJ IDEA 远程连接 mysql 的详细教程一、前缀条件确认二、打开 ID