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语句就有一定的攻击性!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

单片机学习笔记---蜂鸣器播放提示音音乐(天空之城)

目录 蜂鸣器播放提示音 蜂鸣器播放音乐&#xff08;天空之城&#xff09; 准备工作 主程序 中断函数 上一节讲了蜂鸣器驱动原理和乐理基础知识&#xff0c;这一节开始代码演示&#xff01; 蜂鸣器播放提示音 先创建工程&#xff1a;蜂鸣器播放提示音 把我们之前模块化的…

《Linux 简易速速上手小册》第6章: 磁盘管理与文件系统(2024 最新版)

文章目录 6.1 磁盘分区与格式化6.1.1 重点基础知识6.1.2 重点案例&#xff1a;为新硬盘配置分区和文件系统6.1.3 拓展案例 1&#xff1a;创建交换分区6.1.4 拓展案例 2&#xff1a;使用 LVM 管理分区 6.2 挂载与卸载文件系统6.2.1 重点基础知识6.2.2 重点案例&#xff1a;挂载新…

图像处理之《隐写网络的隐写术》论文阅读

一、文章摘要 隐写术是一种在双方之间进行秘密通信的技术。随着深度神经网络(DNN)的快速发展&#xff0c;近年来越来越多的隐写网络被提出&#xff0c;并显示出良好的性能。与传统的手工隐写工具不同&#xff0c;隐写网络的规模相对较大。如何在公共信道上秘密传输隐写网络引起…

【漏洞复现】狮子鱼CMS文件上传漏洞(image_upload.php)

Nx01 产品简介 狮子鱼CMS&#xff08;Content Management System&#xff09;是一种网站管理系统&#xff0c;它旨在帮助用户更轻松地创建和管理网站。该系统拥有用户友好的界面和丰富的功能&#xff0c;包括页面管理、博客、新闻、产品展示等。通过简单直观的管理界面&#xf…

Matplotlib初探:认识数据可视化与Matplotlib

Matplotlib初探&#xff1a;认识数据可视化与Matplotlib Fig.1 利用Matplotlib进行数据可视化( 可视化代码见文末) &#x1f335;文章目录&#x1f335; &#x1f333;引言&#x1f333;&#x1f333;一、数据可视化简介&#x1f333;&#x1f333;二、Matplotlib库简介&#x…

车载电子电器架构 —— 电子电气系统车载功能子系统

车载电子电器架构 —— 电子电气系统车载功能子系统 我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 本就是小人物&#xff0c;输了就是输了&#xff0c…

springboot集成elasticsearch

一、依赖下载 创建好一个springboot项目&#xff0c;需要集成es&#xff1a; 因为springboot默认集成了es&#xff0c;但是版本号需要与本地或者服务器es的版本号一致&#xff0c;我本地es版本是7.14.0&#xff0c;所以需要在<properties></properties>中指定es版…

###C语言程序设计-----C语言学习(12)#进制间转换,十进制,二进制,八进制,十六进制

前言&#xff1a;感谢您的关注哦&#xff0c;我会持续更新编程相关知识&#xff0c;愿您在这里有所收获。如果有任何问题&#xff0c;欢迎沟通交流&#xff01;期待与您在学习编程的道路上共同进步。 计算机处理的所有信息都以二进制形式表示&#xff0c;即数据的存储和计算都采…

Open3D 模型切片

目录 一、算法原理1、算法过程2、主要函数二、代码实现三、结果展示1、原始数据2、切片结果本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT。 一、算法原理

345. Reverse Vowels of a String(反转字符串中的元音字母)

题目描述 给你一个字符串 s &#xff0c;仅反转字符串中的所有元音字母&#xff0c;并返回结果字符串。 元音字母包括 ‘a’、‘e’、‘i’、‘o’、‘u’&#xff0c;且可能以大小写两种形式出现不止一次。 问题分析 不要被题目迷惑了&#xff0c;题意是将元音字符提取出来…

中国电子学会2020年12月份青少年软件编程Scratch图形化等级考试试卷三级真题(编程题)

编程题(共3题&#xff0c;共30分) 36.绘制图形 1. 准备工作: &#xff08;1&#xff09;保留默认小猫角色&#xff0c;隐藏角色&#xff1b; &#xff08;2&#xff09;背景为白色背景。 2. 功能实现: &#xff08;1&#xff09;绘制如下图所示的图案&#xff1b; &…

《Linux 简易速速上手小册》第7章: 网络配置与管理(2024 最新版)

文章目录 7.1 Linux 网络基础7.1.1 重点基础知识7.1.2 重点案例&#xff1a;配置静态 IP 地址7.1.3 拓展案例 1&#xff1a;使用 nmcli 配置网络&#xff08;适用于 Fedora/CentOS&#xff09;7.1.4 拓展案例 2&#xff1a;配置无线网络连接 7.2 静态与动态 IP 配置7.2.1 重点基…

教材管理系统

文章目录 教材管理系统一、系统演示二、项目介绍三、系统部分功能截图四、部分代码展示五、底部获取项目源码&#xff08;9.9&#xffe5;带走&#xff09; 教材管理系统 一、系统演示 教材管理系统 二、项目介绍 语言&#xff1a;nodejs 框架&#xff1a;egg.js、Vue 数据库…

Python入门篇:程序的3种控制结构

Python程序中有三种主要的控制结构&#xff1a;顺序结构、选择结构和循环结构。这些结构允许程序以不同的方式执行代码块&#xff0c;从而实现各种功能。 1.顺序结构&#xff1a;这是最简单的控制结构&#xff0c;程序按照代码从上到下的顺序逐行执行。如果没有特定的控制流语句…

中科大计网学习记录笔记(八):FTP | EMail

前言&#xff1a; 学习视频&#xff1a;中科大郑烇、杨坚全套《计算机网络&#xff08;自顶向下方法 第7版&#xff0c;James F.Kurose&#xff0c;Keith W.Ross&#xff09;》课程 该视频是B站非常著名的计网学习视频&#xff0c;但相信很多朋友和我一样在听完前面的部分发现信…

时域和离散域的重要转换器

自然界的模拟信号都是连续信号&#xff0c;也就是我们常说的时域信号&#xff0c;而我们的计算机只能处理离线的数字量信号&#xff0c;但是我们的闭环控制系统都是由离散域和时域所组成的&#xff0c;这里的离散域包括我们的计算机微控制器&#xff0c;时域包括我们的被控对象…

错误的集合(力扣刷题)

个人主页&#xff08;找往期文章包括但不限于本期文章中不懂的知识点&#xff09;&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 由于作者比较菜&#xff0c;还没学malloc这个函数&#xff0c;因此这个题目只写一些与原题大致的思路。 题目链接&#xff1a;645. 错误的集合 - 力扣…

小周带你正确理解Prompt-engineering,RAG,fine-tuning工程化的地位和意义

有人会说&#xff1a;"小周&#xff0c;几天不见这么拉了&#xff0c;现在别说算法了&#xff0c;连code都不讲了&#xff0c;整上方法论了。" 我并没有拉&#xff01;而且方法论很重要&#xff0c;尤其工程化的时候&#xff0c;你总得知道每种技术到底适合干啥&…

创建你的第一个Vue项目(小白专享版本)

&#x1f497;&#x1f497;&#x1f497;欢迎来到我的博客&#xff0c;你将找到有关如何使用技术解决问题的文章&#xff0c;也会找到某个技术的学习路线。无论你是何种职业&#xff0c;我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章&#xff0c;也欢…

TestNG基础教程

TestNG基础教程 一、常用断言二、执行顺序三、依赖测试四、参数化测试1、通过dataProvider实现2、通过xml配置&#xff08;这里是直接跑xml&#xff09; 五、testng.xml常用配置方式1、分组维度控制2、类维度配置3、包维度配置 六、TestNG并发测试1、通过注解来实现2、通过xml来…