首页 > 数据库 >SQLAlchemy 执行原生 SQL 语句

SQLAlchemy 执行原生 SQL 语句

时间:2024-07-13 18:30:46浏览次数:16  
标签:语句 execute SQLAlchemy db cursor session SQL

在使用 SQLAlchemy 进行数据库操作时,虽然 ORM 提供了强大的模型映射功能,但有时候直接使用原生 SQL 语句可能更加简单直率,甚至性能更优。下面我们来看一下如何在 SQLAlchemy 中执行原生的 SQL 语句。

执行原生 SQL 语句的步骤

  1. 构造 SQL 语句
  2. 调用 session 中的 execute 方法执行,得到游标对象
  3. 通过游标获取结果

示例:查询学生信息

首先,我们来看一个查询学生信息的示例。

import db


sql = db.text('SELECT * FROM tb_student')
cursor = db.session.execute(sql)
print(cursor)  # 打印游标对象

这段代码构造了一条查询所有学生信息的 SQL 语句,并通过 db.session.execute 方法执行,得到一个游标对象。

获取查询结果

获取一条结果

import db


cursor = db.session.execute(db.text('SELECT * FROM tb_student'))
print(cursor.mappings().fetchone())

使用 mappings().fetchone() 方法可以将结果转换为字典并获取一条记录。

获取指定数量的结果

import db


cursor = db.session.execute(db.text('SELECT * FROM tb_student'))
print(cursor.mappings().fetchmany(2))

使用 mappings().fetchmany(2) 方法可以获取指定数量的记录,这里获取了两条记录。

获取所有结果

import db


cursor = db.session.execute(db.text('SELECT * FROM tb_student'))
print(cursor.mappings().fetchall())

使用 mappings().fetchall() 方法可以获取所有记录。

示例:插入学生数据

接下来,我们来看一个插入学生数据的示例。

import db


sql = db.text(
    'INSERT INTO tb_student(name, class, age, sex, description) VALUES(:name, :class_, :age, :sex, :description)'
)
data = dict(
    name='李小白',
    age=17,
    sex=True,
    class_=1,
    description='大河之剑天上来',
)
cursor = db.session.execute(sql, params=data)
db.session.commit()
print(cursor.lastrowid)  # 打印新插入记录的主键值

这段代码构造了一条插入学生数据的 SQL 语句,并使用命名参数(如 :name, :class_ 等)来避免 SQL 注入问题。然后,通过 db.session.execute 方法执行插入操作,并提交事务。最后,使用 cursor.lastrowid 获取新插入记录的主键值。

复习一下

  1. 构造 SQL 语句:使用 db.text 方法构造 SQL 语句。
  2. 执行 SQL 语句:使用 db.session.execute 方法执行 SQL 语句,并得到游标对象。
  3. 获取结果:通过游标对象的 mappings() 方法,将结果转换为字典格式,并使用 fetchone(), fetchmany(n), 或 fetchall() 方法获取结果。

注意事项

  • SQL 注入防护:使用命名参数(如 :name, :class_ 等)来防止 SQL 注入。
  • 事务管理:在执行插入、更新或删除操作时,别忘了提交事务(db.session.commit())。
  • 游标对象:通过游标对象可以获取查询结果,也可以获取插入操作生成的主键值(lastrowid)。

标签:语句,execute,SQLAlchemy,db,cursor,session,SQL
From: https://www.cnblogs.com/gupingan/p/18300468

相关文章

  • 网络安全——SQL注入
    一、概念SQL注入原理        在与数据库交互的地方程序没有对用户的输入做严格的过滤和限制,导致用户可以构造恶意的sql语句拼接在参数后面,然后带到数据库中执行,sql注入属于服务端攻击,和操作系统和编程语言无关。SQL注入提交方式        get......
  • Mysql数据库之约束条件
    一、主键约束主键约束(PRIMARYKEYconstraint)用于唯一标识数据库表中的每条记录。语法:createtable 表名(   列名1数据类型primary key,   列名2数据类型,   ...);在主键的后面添加:auto_increment,可以让主键自增。设置auto_increment之后,可以......
  • 【java深入学习第1章】深入探究 MyBatis-Spring 中 SqlSession 的原理与应用
    前言在使用MyBatis进行持久层开发时,通常会与Spring框架集成,以便更好地管理事务和依赖注入。在MyBatis-Spring集成中,SqlSession是一个非常重要的概念。本文将详细介绍SqlSessionTemplate和SqlSessionDaoSupport,并提供相关的代码示例。一、SqlSessionTemplateSqlSessio......
  • 流程循环控制语句
    目录for循环带列表循环不带列表循环类C风格循环while循环语法无限循环使用示例until循环基本语法示例select循环语法格式嵌套循环break和continuebreak的使用continue的使用在shell中循环有以下几种:for循环        while循环until循环selec......
  • Msql数据库之DDL(数据定义语言)的相关操作
    数据定义语言(DDL):用于创建、修改和删除数据库对象,如数据库、表、视图、索引等一、数据库的相关操作:1、创建数据库语法:createdatabase[ifnotexists]数据库名;例:createdatabaseifnotexiststest;2、使用(切换)数据库:语法:use 数据库名;例:use test;3、查......
  • MYSQL 从入门到熟练 详解(看这一篇就够啦)
    一、MYSQL入门1.数据库概述(1)定义数据库(Database)是“按照数据结构来组织、存储和管理数据的仓库”。它是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合。数据库中的数据按一定的数据模型组织、描述和存储,具有较小的数据冗余、较高的数据独立性和......
  • 【PyQt5连接Mysql】python连接成功记录(版本对应)-最新
    在做一个qt登陆注册界面时,不得不使用数据库的连接,但是一直连接失败,记录一下个人成功解决的方法,希望能帮到各位。我的版本为Qt5VersionNumberis:5.15.2,PyQt5Versionis:5.15.10,Mysql8.0。参考:①PyCharm+PyQt5(5.15.2)+mysql,PyQt5连接mysql,踩坑与解决办法②PyQt5连......
  • idea 出现[08S01] 驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全
    目录1.问题所示2.原理分析3.解决方法1.问题所示idea配置Database的时候,出现如下问题:Failed  Copy SearchError Troubleshooting[08S01]驱动程序无法通过使用安全套接字层(SSL)加密与SQLServer建立安全连接。错误:“Theserverselectedprotoco......
  • 在 PostgreSQL(简称 pg)数据库中,普通用户修改自己的密码可以通过 SQL 命令完成?可以
    查看权限ALTERUSERusernameWITHPASSWORD'newpassword';如果你是以普通用户身份登录,通常你只能更改自己的密码,而不能更改其他用户的密码。在PostgreSQL中,普通用户通常拥有的权限取决于他们在数据库中的角色和分配给他们的权限。数据库管理员(DBA)可以为不同的用......
  • MySQL数据库day7.11
    一,SQL概述1.1 SQL语句语法MySQL数据库的SQL语句不区分大小写,关键字建议使用大写,以分号结尾。例如:SELECT*FROMuser;使用/**/、--、#的方式完成注释/*多行注释*/--单行注释#单行注释SELECT*FROMuser;1.2 SQL中数据的常用数据类型......