Python访问数据库

目录

SQLite数据库

SQLite数据类型

Python数据类型与SQLite数据类型的映射

使用GUI管理工具管理SQLite数据库

数据库编程的基本操作过程

sqlite3模块API

数据库连接对象Connection

游标对象Cursor

数据库的CRUD操作示例

示例中的数据表

无条件查询

有条件查询

插入数据

更新数据

删除数据

防止SQL注入攻击

如果数据量较少,则我们可以将数据保存到文件中;如果数据量较大,则我们可以将数据保存到数据库中。

SQLite数据库

SQLite是嵌入式系统使用的关系数据库,目前的主流版本是SQLite3。SQLite是开源的,采用C语言编写而成,具有可移植性强、可靠性高 、小而易用等特点。SQLite提供了对SQL-92标准的支持,支持多表、索引、事务、视图和触发。

SQLite数据类型

SQLite是无数据类型的数据库,在创建表时不需要为字段指定数据类型。但从编程规范上讲,我们应该指定数据类型,因为数据类型可以表明这个字段的含义,便于我们阅读和理解代码。 SQLite支持的常见数据类型如下。

INTEGER:有符号的整数类型。

REAL:浮点类型。

TEXT:字符串类型,采用UTF-8和UTF-16字符编码。

BLOB:二进制大对象类型,能够存放任意二进制数据。

注意:SQLite是为嵌入式设备(如智能手机等)设计的数据库。SQLite在运行时与使用它的应用程序之间共用相同的进程空间。而在运行时,Oracle和MySQL程序与使用它的应用程序在两个不同的进程中。

Python数据类型与SQLite数据类型的映射

在使用Python访问SQLite数据库时,会经常涉及数据类型的互相转换。它们的映射关系如下表所示。

使用GUI管理工具管理SQLite数据库

SQLite数据库本身自带一个基于命令提示符的管理工具,使用起来很困难。如果使用GUI管理工具,则需要使用第三方工具。第三方GUI管理工具有很多,例如Sqliteadmin Administrator、DB Browser for SQLite、SQLiteStudio等。DB Browser for SQLite对中文支持很好,所以推荐使用该工具。

(1)安装和启动DB Browser for SQLite

在官网下载DB.Browser.for.SQLite-3.11.2-win32.zip安装包文件,将该文件解压到一个目录中,在解压目录下找到DB Browser for SQLite.exe文件,双击该文件即可启动DB Browser for SQLite工具。

 (2)创建数据库

一个SQLite数据库对应一个SQLite数据文件,为了测试DB Browser for SQLite工具,我们要先创建SQLite数据库。

在上图所示的界面单击工具栏中的“新建数据库”按钮,弹出保存文件对话框。

(3)创建数据表

在一个SQLite数据库中可以包含多个数据表。在上图所示的界面单击“保存”按钮,弹出建表对话框。

注意:候选键与主键类似,都不可以重复,但候选键可以为空,而主键不能为空。

(4)执行SQL语句

使用DB Browser for SQLite工具,可以执行任意合法的SQL语句。

 (5)浏览数据

DB Browser for SQLite常用于浏览数据。

数据库编程的基本操作过程

数据库编程主要分为两类:查询(Read)和修改(C插入、U更新 、D删除)。

(1)查询数据

查询数据时需要6步,在查询过程中需要提取数据结果集,最后释放资源,即关闭游标和数据库。

 

 (2)修改数据

修改数据时如上图所示,最多需要6步,在修改过程中如果执行SQL操作成功,则提交数据库事务;如果失败,则回滚事务。最后释放资源,关闭游标和数据库。

数据库事务是修改数据库的一系列操作,这些操作要么全部执行,要么全部不执行。若全部操作执行成功,则确定修改,称之为“提交事务”;如果有操作执行失败,则放弃修改,称之为“回滚事务”

sqlite3模块API

Python官方提供了sqlite3模块来访问SQLite数据库。

数据库连接对象Connection

数据库访问的第一步是进行数据库连接。

我们可以通过connect(database)函数建立数据库连接,参数database是SQLite数据库的文件路径,如果连接成功,则返回数据库连接对象Connection。

Connection对象有如下重要的方法。

close():关闭数据库连接,在关闭之后再使用数据库连接将引发异常。

commit():提交数据库事务。

rollback():回滚数据库事务。

cursor():获得Cursor游标对象。

游标对象Cursor

一个Cursor游标对象表示一个数据库游标,游标暂时保存了SQL操作所影响到的数据。游标是通过数据库连接创建的。

游标Cursor对象有很多方法和属性,其中的基本SQL操作方法如下 。

execute(sql[,parameters]):执行一条SQL语句,sql是SQL语句 ,parameters是为SQL提供的参数,可以是序列或字典类型。返回值是整数,表示执行SQL语句影响的行数。

executemany(sql[,seq_of_params]):执行批量SQL语句,sql是SQL语句,seq_of_params是为SQL提供的参数,seq_of_params是序列。 返回值是整数,表示执行SQL语句影响的行数。

在通过execute()和executemany()方法执行SQL查询语句后, 还要通过提取方法从查询结果集中返回数据,相关提取方法如下。

fetchone():从结果集中返回只有一条记录的序列,如果没有数据,则返回None。

fetchmany(size=cursor.arraysize):从结果集中返回小于等于size记录数的序列,如果没有数据,则返回空序列,size在默认情况下是整个游标的行数。

fetchall():从结果集中返回所有数据。

数据库的CRUD操作示例

对数据库表中的数据可以进行4类操作:数据插入(Create)、数据查询(Read)、数据更新(Update)和数据删除(Delete),即增、删 、改、查。

示例中的数据表

为了介绍数据库的CRUD操作,这里修改前面school_db数据库中的student(学生)表。

为了查询方便,我们预先插入几条记录。

 

无条件查询

SQL查询语句是SELECT,根据是否带有WHERE子句,分为:无条件查询和有条件查询,本节先介绍无条件查询。 无条件查询最为简单,没有WHERE子句。

示例代码如下:

import sqlite3
try:# 1.建立数据库连接con=sqlite3.connect('school_db.db')# 2.创建游标对象cursor=con.cursor()# 3.执行SQL查询操作sql='SELECT s_id,s_name,s_sex,s_birthday FROM student'cursor.execute(sql)# 提取结果集result_set=cursor.fetchall() # 从结果集中返回所有数据for row in result_set: # 遍历结果集print('学号:{0}-姓名:{1}-性别:{2}-生日:{3}'.format(row[0],row[1],row[2],row[3]))
except sqlite3.Error as e:print('数据查询发生错误:{}'.format(e))
finally:# 5.关闭游标if cursor:cursor.close()# 6.关闭数据连接if con:con.close()

通过Python指令运行文件。

有条件查询

有条件查询带有WHERE子句,WHERE子句是查询条件。

示例代码如下:

import sqlite3
istr=input('请输入生日(yyyyMMdd):') # 从控制台输入查询条件(生日)
try:# 1.建立数据库连接con=sqlite3.connect('school_db.db')# 2.创建游标对象cursor=con.cursor()# 3.执行SQL查询操作sql='SELECT s_id,s_name,s_sex,s_birthday FROM student FROM student WHERE s_birthday < ?' # 查询条件中的占位符cursor.execute(sql,[istr]) # 参数放到序列或元组中# 4.提取结果集result_set=cursor.fetchall() # 从结果集中返回所有数据for row in result_set: # 遍历结果集print('学号:{0}-姓名:{1}-性别:{2}-生日:{3}'.format(row[0],row[1],row[2],row[3]))
except sqlite3.Error as e:print('数据查询发生错误:{}'.format(e))
finally:# 5.关闭游标if cursor:cursor.close()# 6.关闭数据连接if con:con.close()

通过Python指令运行文件。

插入数据

数据插入操作SQL语句是INSERT。

示例代码如下:

import sqlite3
i_name=input('请输入【姓名】:')
i_sex=input('请输入【性别】:')
i_birthday=input('请输入【生日】(yyyyMMdd):')try:# 1.建立数据库连接con=sqlite3.connect('school_db.db')# 2.创建游标对象cursor=con.cursor()# 3.执行SQL查询操作sql='INSERT INTO student (s_name,s_sex,s_birthday) VALUES(?,?,?)' # 查询条件中的占位符cursor.execute(sql,[i_name,i_sex,i_birthday]) # 参数放到序列或元组中# 4.提交数据库事务con.commit() # 插入成功,提交事务print('插入数据成功。')
except sqlite3.Error as e:print('数据查询发生错误:{}'.format(e))# 4.回滚数据库事务con.rollback() # 插入失败,回滚事务
finally:# 5.关闭游标if cursor:cursor.close()# 6.关闭数据连接if con:con.close()

通过Python指令运行文件。

数据插入成功,可以使用DB Browser for SQLite浏览数据。

更新数据

数据更新操作SQL语句是UPDATE。

示例代码如下:

import sqlite3
i_id=input('请输入【学号】:')
i_name=input('请输入【姓名】:')
i_sex=input('请输入【性别】:')
i_birthday=input('请输入【生日】(yyyyMMdd):')try:# 1.建立数据库连接con=sqlite3.connect('school_db.db')# 2.创建游标对象cursor=con.cursor()# 3.执行SQL查询操作sql='UPDATE student SET s_name=?,s_sex=?,s_birthday=? WHERE s_id=?' # 查询条件中的占位符cursor.execute(sql,[i_name,i_sex,i_birthday,i_id]) # 参数放到序列或元组中# 4.提交数据库事务con.commit() # 插入成功,提交事务print('插入数据成功。')
except sqlite3.Error as e:print('数据查询发生错误:{}'.format(e))# 4.回滚数据库事务con.rollback() # 插入失败,回滚事务
finally:# 5.关闭游标if cursor:cursor.close()# 6.关闭数据连接if con:con.close()

通过Python指令运行文件。

数据更新成功,可以使用DB Browser for SQLite浏览数据。

删除数据

数据删除操作SQL语句是DELETE。

示例代码如下:

import sqlite3
i_id=input('请输入要删除学生的【学号】:')try:# 1.建立数据库连接con=sqlite3.connect('school_db.db')# 2.创建游标对象cursor=con.cursor()# 3.执行SQL查询操作sql='DELETE FROM student WHERE s_id=?' # 查询条件中的占位符cursor.execute(sql,[i_id]) # 参数放到序列或元组中# 4.提交数据库事务con.commit() # 插入成功,提交事务print('插入数据成功。')
except sqlite3.Error as e:print('数据查询发生错误:{}'.format(e))# 4.回滚数据库事务con.rollback() # 插入失败,回滚事务
finally:# 5.关闭游标if cursor:cursor.close()# 6.关闭数据连接if con:con.close()

通过Python指令运行文件。

 

数据更新成功,可以使用DB Browser for SQLite浏览数据。

防止SQL注入攻击

 # 3.执行SQL查询操作sql='SELECT s_id,s_name,s_sex,s_birthday FROM student WHERE s_birthday <'+istr # 查询条件中的占位符cursor.execute(sql) 

在构建SQL语句时,参数采用占位符占位,在执行时再传递实参,这种方式太麻烦!不仅是查询操作,所有的SQL语句构建都可以采用拼接参数实现,但有一个潜在风险——会受到“SQL注入攻击”。SQL注入攻击指在传递实参时,使用特殊字符或SQL关键字,在拼接成SQL后,这条SQL语句就有一定的攻击性!

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

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

相关文章

【Java多线程】对进程与线程的理解

目录 1、进程/任务&#xff08;Process/Task&#xff09; 2、进程控制块抽象(PCB Process Control Block) 2.1、PCB重要属性 2.2、PCB中支持进程调度的一些属性 3、 内存分配 —— 内存管理&#xff08;Memory Manage&#xff09; 4、线程&#xff08;Thread&#xff09;…

Unity(单元测试)在STM32上的移植与应用

概述 Unity Test是一个为C构建的单元测试框架。本文基于STM32F407为基础&#xff0c;完全使用STM32CubeIDE进行开发&#xff0c;移植和简单使用Unity。 单片机型号&#xff1a;STM32F407VET6 软件&#xff1a;STM32CubeIDE Version: 1.14.1 Unity Version&#xff1a;2.…

相机图像质量研究(22)常见问题总结:CMOS期间对成像的影响--光学串扰

系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结&#xff1a;光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结&#xff1a;光学结构对成…

LeetCode、338. 比特位计数【简单,位运算】

文章目录 前言LeetCode、338. 比特位计数【中等&#xff0c;位运算】题目链接与分类思路位运算移位处理前缀思想实现 资料获取 前言 博主介绍&#xff1a;✌目前全网粉丝2W&#xff0c;csdn博客专家、Java领域优质创作者&#xff0c;博客之星、阿里云平台优质作者、专注于Java…

快速学习Spring

Spring 简介 Spring 是一个开源的轻量级、非侵入式的 JavaEE 框架&#xff0c;它为企业级 Java 应用提供了全面的基础设施支持。Spring 的设计目标是简化企业应用的开发&#xff0c;并解决 Java 开发中常见的复杂性和低效率问题。 Spring常用依赖 <dependencies><!-…

OpenCV入门:图像处理的基石

在数字图像处理领域&#xff0c;OpenCV&#xff08;开源计算机视觉库&#xff09;是一个不可或缺的工具。它包含了一系列强大的算法和函数&#xff0c;使得开发者可以轻松地处理图像和视频数据。本文将带你走进OpenCV的世界&#xff0c;了解其基本概念和常见应用。 1. OpenCV简…

【51单片机】DS18B20(江科大)

一、DS18B20温度传感器 1.DS18B20介绍 DS18B20是一种常见的数字温度传感器,其控制命令和数据都是以数字信号的方式输入输出,相比较于模拟温度传感器,具有功能强大、硬件简单、易扩展、抗干扰性强等特点 测温范围 :- 55℃到125℃ 通信接口:1-Wire(单总线) 其它特征:可形成…

Crypto--RSA

题目&#xff1a;RSA&#xff08;BUUCTF-CRYPTO-RSABUUCTF在线评测&#xff09; 解题过程&#xff1a;直接利用RSAtool工具&#xff08;RSA-Tool 2(RSA算法辅助工具)V1.7绿色版下载 - 下载吧 (xiazaiba.com)&#xff09;解题。

数据结构(4) 链表(链式存储)

链表&#xff08;链式存储&#xff09; 单链表定义基本操作的实现单链表的插入按位序插入指定节点的前插指定节点的后插 单链表的删除 小结 单链表 定义 顺序表优点:可随机存取&#xff0c;存储密度高&#xff0c;缺点:要求大片连续空间&#xff0c;改变容量不方便。 单链表优…

云计算基础-虚拟化概述

虚拟化概述 虚拟化是一种资源管理技术&#xff0c;能够将计算机的各种实体资源&#xff08;如CPU、内存、磁盘空间、网络适配器等&#xff09;予以抽象、转换后呈现出来并可供分割、组合为一个或多个逻辑上的资源。这种技术通过在计算机硬件上创建一个抽象层&#xff0c;将单台…

人工智能学习与实训笔记(七):神经网络之推荐系统处理

九、模型压缩与知识蒸馏 出于对响应速度&#xff0c;存储大小和能耗的考虑&#xff0c;往往需要对大模型进行压缩。 模型压缩方法主要可以分为以下四类&#xff1a; 参数修剪和量化&#xff08;Parameter pruning and quantization&#xff09;&#xff1a;用于消除对模型表…

蓝桥省赛真题|简单:分数

题目链接&#xff1a;https://www.lanqiao.cn/problems/610/learning/?page1&first_category_id1&second_category_id3&tags2018&name%E5%88%86%E6%95%B0 题不难&#xff0c;但是可以帮助编程时好的习惯的养成&#xff0c;更加注意一些细节。 注意几个地方︰…

机器人专题:我国机器人产业园区发展现状、问题、经验及建议

今天分享的是机器人系列深度研究报告&#xff1a;《机器人专题&#xff1a;我国机器人产业园区发展现状、问题、经验及建议》。 &#xff08;报告出品方&#xff1a;赛迪研究院&#xff09; 报告共计&#xff1a;26页 机器人作为推动工业化发展和数字中国建设的重要工具&…

【RT-DETR有效改进】利用EMAttention加深网络深度提高模型特征提取能力(特征选择模块)

一、本文介绍 本文给大家带来的改进机制是EMAttention注意力机制&#xff0c;它的核心思想是&#xff0c;重塑部分通道到批次维度&#xff0c;并将通道维度分组为多个子特征&#xff0c;以保留每个通道的信息并减少计算开销。EMA模块通过编码全局信息来重新校准每个并行分支中…

【Qt】环境安装与初识

目录 一、Qt背景介绍 二、搭建Qt开发环境 三、新建工程 四、Qt中的命名规范 五、Qt Creator中的快捷键 六、QWidget基础项目文件详解 6.1 .pro文件解析 6.2 widget.h文件解析 6.3 widget.cpp文件解析 6.4 widget.ui文件解析 6.5 main.cpp文件解析 七、对象树 八、…

MySQL 基础知识(一)之数据库和 SQL 概述

目录 1 数据库相关概念 2 数据库的结构 ​3 SQL 概要 4 SQL 的基本书写规则 1 数据库相关概念 数据库是将大量的数据保存起来&#xff0c;通过计算机加工而成的可以进行高效访问的数据集合数据库管理系统&#xff08;DBMS&#xff09;是用来管理数据库的计算机系统&#xf…

指针的经典笔试题

经典的指针试题&#xff0c;让你彻底理解指针 前言 之前对于指针做了一个详解&#xff0c;现在来看一些关于指针的经典面试题。 再次说一下数组名 数组名通常表示的都是首元素的地址&#xff0c;但是有两个意外&#xff0c;1.sizeof&#xff08;数组名&#xff09;这里数组名…

stm32:pwm output模块,记录一下我是用smt32,输出pwm波的记录--(实现--重要)

我是实现了输出pwm波&#xff0c;频率固定&#xff0c;占空比可以不断调整的方法&#xff0c;将PA0接到示波器上&#xff0c;可以看到是一个标准的PWM波&#xff0c;如图下面示波器图。 1&#xff0c;首先是ioc的配置 我刚开始设置的分频的倍数是7199&#xff0c;使得分频的太…

Mac M2芯片配置PHP环境

Mac M2芯片配置PHP环境 1. XAMPP2. PHPBrew(PHP版本管理)安装php7.4.33版本 参考 1. XAMPP 官网地址 https://www.apachefriends.org/ 安装 安装完成 web server打开后&#xff0c;在打开localhost 成功&#xff01; 2. PHPBrew(PHP版本管理) 官方文档 https://github.co…

【教程】C++语言基础学习笔记(五)——Vector向量

写在前面&#xff1a; 如果文章对你有帮助&#xff0c;记得点赞关注加收藏一波&#xff0c;利于以后需要的时候复习&#xff0c;多谢支持&#xff01; 【C语言基础学习】系列文章 第一章 《项目与程序结构》 第二章 《数据类型》 第三章 《运算符》 第四章 《流程控制》 第五章…