Python访问数据库

news2024/11/27 5:35:42

目录

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.coloradmin.cn/o/1450933.html

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

相关文章

CSS3学习(一)

1. 语法规范 CSS主要由选择器和一条或多条的声明构成。 选择器用于指定CSS样式的HTML标签&#xff0c;花括号里面是对应的具体样式 属性与属性值以键值对的形式出现&#xff0c;属性与属性之间用分号隔开 <head>里写<style> 2. 基础选择器 【作用】选择标签使…

Panalog 日志审计系统 libres_syn_delete.php 前台RCE漏洞复现

0x01 产品简介 Panalog是一款日志审计系统,方便用户统一集中监控、管理在网的海量设备。 0x02 漏洞概述 Panalog日志审计系统 libres_syn_delete.php接口处存在远程命令执行漏洞,攻击者可执行任意命令,接管服务器权限。 0x03 影响范围 version <= MARS r10p1Free 0…

LabVIEW虚拟测试与分析仪

LabVIEW虚拟测试与分析仪 在现代工程技术领域&#xff0c;虚拟仪器的开发和应用已成为一种趋势。利用LabVIEW软件平台开发的虚拟测试与分析仪器进行展开&#xff0c;实现工程测试和分析中的实际需求。通过结合LabVIEW的强大功能和灵活性&#xff0c;成功实现了一套高效、精确的…

Linux第53步_移植ST公司的linux内核第5步_系统镜像打包并烧录到EMMC

本节主要学习系统镜像打包&#xff0c;然后将打包文件烧录到EMMC测试。 1、创建bootfs文件夹 1)、打开第1个终端 输入“ls回车” 输入“cd linux/回车”&#xff0c;切换到“linux”目录 输入“ls回车”&#xff0c;列出“linux”目录下的文件和文件夹 输入“cd atk-mp1/…

【Linux取经路】文件系统之被打开的文件——文件描述符的引入

文章目录 一、明确基本共识二、C语言文件接口回顾2.1 文件的打开操作2.2 文件的读取写入操作2.3 三个标准输入输出流 三、文件有关的系统调用3.1 open3.1.1 比特位级别的标志位传递方式 3.2 write3.2.1 模拟实现 w 选项3.2.2 模拟实现 a 选项 3.3 read 四、访问文件的本质4.1 再…

leetcode(二分查找)34.在排序数组中查找元素的第一个和最后一个位置(C++详细解释)DAY11

文章目录 1.题目示例提示 2.解答思路3.实现代码结果 4.总结 1.题目 给你一个按照非递减顺序排列的整数数组 nums&#xff0c;和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。 如果数组中不存在目标值 target&#xff0c;返回 [-1, -1]。 你必须设计…

多线程基础使用

提示&#xff1a;有关线程六大状态, 以及创建线程的五种方法 线程 线程线程状态NEWRUNNABLEBLOCKEDWAITINGTIMED_WAITINGTERMINATED 线程状态转化图线程创建使用方式ps 线程 线程状态 操作系统的线程主要有以下三个状态&#xff1a; 就绪状态(ready)&#xff1a;线程正在等待使…

Uipath 实现Excel 文件合并

场景描述 某文件夹下有多个相同结构(标题列相同)的Excel 文件&#xff0c;需实现汇总到一个Excel文件。 常见场景有销售明细汇总&#xff0c;订单汇总等。 解决方案 对于非IT 人员则可使用Uipath 新式Excel活动&#xff0c;通过拖拉实现。也可以通过内存表或使用VB脚本&…

neo4j下载安装最新教程 2024.02

文章目录 neo4j简介neo4j与jdk版本对应neo4j历史版本 下载地址配置环境变量命令行启动验证安装结果 neo4j简介 Neo4j 是一个高性能的 NoSQL 图形数据库&#xff0c;它将结构化数据存储在网络&#xff08;从数学角度叫做图&#xff09;上而不是表中。Neo4j 也可以被看作是一个高…

相机图像质量研究(20)常见问题总结:CMOS期间对成像的影响--全局快门/卷帘快门

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

代码随想录算法训练营第三三天 | K次取反后最大化数组和、加油站、分发糖果

目录 K次取反后最大化的数组和加油站分发糖果 LeetCode 1005. K次取反后最大化的数组和 LeetCode 134. 加油站 LeetCode 135. 分发糖果 K次取反后最大化的数组和 局部最优&#xff1a;让绝对值大的负数变为正数&#xff0c;当前数值达到最大。 整体最优&#xff1a;整个数组和…

机器学习入门--门控循环单元(GRU)原理与实践

GRU模型 随着深度学习领域的快速发展&#xff0c;循环神经网络&#xff08;RNN&#xff09;已成为自然语言处理&#xff08;NLP&#xff09;等领域中常用的模型之一。但是&#xff0c;在RNN中&#xff0c;如果时间步数较大&#xff0c;会导致梯度消失或爆炸的问题&#xff0c;…

超详细的介绍Python语句

一、 常用命令 在介绍Python语句之前&#xff0c;先介绍一下几个有用的Python命令。 dir(模块名或类名或变量名或表达式名)&#xff1a;获得当前模块、变量对应类型、表达式计算值对应类的属性列表 type&#xff08;变量名或表达式名&#xff09;:获取变量或表达式计算值的对…

[嵌入式系统-14]:常见实时嵌入式操作系统比较:RT-Thread、uC/OS-II和FreeRTOS、Linux

目录 一、实时嵌入式操作系统 1.1 概述 1.2 什么“实时” 1.3 什么是硬实时和软实时 1.4 什么是嵌入式 1.5 什么操作系统 二、常见重量级操作系统 三、常见轻量级嵌入式操作系统 3.1 概述 3.2 FreeRTOS 3.3 uC/OS-II 3.4 RT-Thread 3.5 RT-Thread、uC/OS-II、Free…

第5讲前端静态登录页面实现

前端静态登录页面实现 引入全局样式&#xff1a; main.js导入样式文件&#xff1a; import /assets/styles/border.css import /assets/styles/reset.css加路由&#xff1a; const routes [{path: /login,name: login,component: () > import(../views/Login.vue)} ]App…

pytorch tensor维度变换

目录 1. view/reshape2. squeeze/unsqueeze3. expand 扩展4. repeat5 .t转置6. transpose7. permute 1. view/reshape view(*shape) → Tensor 作用&#xff1a;类似于reshape&#xff0c;将tensor转换为指定的shape&#xff0c;原始的data不改变。返回的tensor与原始的tensor…

LD-802D-X6

LD-802D-X6足浴按摩器&#xff0c;买个给老人家&#xff0c;解决泡脚越泡越冷&#xff0c;调节温度和定式问题&#xff0c; 按摩功能老人体验说太痒&#xff0c;转太快了&#xff0c;哈哈 下面是安装步骤使用说明 其实这包零件就是安装底部4个轮子&#xff0c;4个轮子的中间滚…

单片机学习笔记---LCD1602

LCD1602介绍 LCD1602&#xff08;Liquid Crystal Display&#xff09;液晶显示屏是一种字符型液晶显示模块&#xff0c;可以显示ASCII码的标准字符和其它的一些内置特殊字符&#xff08;比如日文的片假名&#xff09;&#xff0c;还可以有8个自定义字符 显示容量&#xff1a;…

基于GPT一键完成数据分析全流程的AI Agent: Streamline Analyst

大型语言模型&#xff08;LLM&#xff09;的兴起不仅为获取知识和解决问题开辟了新的可能性&#xff0c;而且催生了一些新型智能系统&#xff0c;例如旨在辅助用户完成特定任务的AI Copilot以及旨在自动化和自主执行复杂任务的AI Agent&#xff0c;使得编程、创作等任务变得高效…

gem5 garnet 合成流量: packet注入流程

代码流程 下图就是全部. 剩下文字部分是细节补充,但是内容不变: bash调用python,用python配置好configuration, 一个cpu每个tick运行一次,requestport发出pkt. bash 启动 python文件并配置 ./build/NULL/gem5.debug configs/example/garnet_synth_traffic.py \--num-cpus…