使用SQLite

news/2024/11/1 18:29:45/
SQLite是一种嵌入式数据库,它的数据库就是一个文件。由于SQLite本身是C写的,而且体积很小,所以,经常被集成到各种应用程序中,甚至在iOS和Android的App中都可以集成。
Python就内置了SQLite3,所以,在Python中使用SQLite,不需要安装任何东西,直接使用。
在使用SQLite前,我们先要搞清楚几个概念:
表是数据库中存放关系数据的集合,一个数据库里面通常都包含多个表,比如学生的表,班级的表,学校的表,等等。表和表之间通过外键关联。
要操作关系数据库,首先需要连接到数据库,一个数据库连接称为Connection;
连接到数据库后,需要打开游标,称之为Cursor,通过Cursor执行SQL语句,然后,获得执行结果。
Python定义了一套操作数据库的API接口,任何数据库要连接到Python,只需要提供符合Python标准的数据库驱动即可。
由于SQLite的驱动内置在Python标准库中,所以我们可以直接来操作SQLite数据库。

我们在Python交互式命令行实践一下:

# 导入SQLite驱动:
>>> import sqlite3
# 连接到SQLite数据库
# 数据库文件是test.db
# 如果文件不存在,会自动在当前目录创建:
>>> conn = sqlite3.connect('test.db')
# 创建一个Cursor:
>>> cursor = conn.cursor()
# 执行一条SQL语句,创建user表:
>>> cursor.execute('create table user (id varchar(20) primary key, name varchar(20))')
<sqlite3.Cursor object at 0x10f8aa260>
# 继续执行一条SQL语句,插入一条记录:
>>> cursor.execute('insert into user (id, name) values (\'1\', \'Michael\')')
<sqlite3.Cursor object at 0x10f8aa260>
# 通过rowcount获得插入的行数:
>>> cursor.rowcount
1
# 关闭Cursor:
>>> cursor.close()
# 提交事务:
>>> conn.commit()
# 关闭Connection:
>>> conn.close()
我们再试试查询记录:

>>> conn = sqlite3.connect('test.db')
>>> cursor = conn.cursor()
# 执行查询语句:
>>> cursor.execute('select * from user where id=?', ('1',))
<sqlite3.Cursor object at 0x10f8aa340>
# 获得查询结果集:
>>> values = cursor.fetchall()
>>> values
[('1', 'Michael')]
>>> cursor.close()
>>> conn.close()
使用Python的DB-API时,只要搞清楚Connection和Cursor对象,打开后一定记得关闭,就可以放心地使用。
使用Cursor对象执行insert,update,delete语句时,执行结果由rowcount返回影响的行数,就可以拿到执行结果。
使用Cursor对象执行select语句时,通过featchall()可以拿到结果集。结果集是一个list,每个元素都是一个tuple,对应一行记录。
如果SQL语句带有参数,那么需要把参数按照位置传递给execute()方法,有几个?占位符就必须对应几个参数,例如:
cursor.execute('select * from user where name=? and pwd=?', ('abc', 'password'))
SQLite支持常见的标准SQL语句以及几种常见的数据类型。具体文档请参阅SQLite官方网站。
小结
在Python中操作数据库时,要先导入数据库对应的驱动,然后,通过Connection对象和Cursor对象操作数据。
要确保打开的Connection对象和Cursor对象都正确地被关闭,否则,资源就会泄露。
如何才能确保出错的情况下也关闭掉Connection对象和Cursor对象呢?请回忆try:...except:...finally:...的用法。


http://www.ppmy.cn/news/919316.html

相关文章

Redisson报异常attempt to unlock lock, not locked by current thread by node id解决方案

Redisson报异常attempt to unlock lock, not locked by current thread by node id解决方案 问题背景解决方案总结Lyric&#xff1a; 那想念的身影 问题背景 Redisson做分布式锁是目前比较流行的方式&#xff0c;但是在使用的过程中遇到一些坑&#xff1a; Redisson的分布式锁…

带农历日期的html代码,网页日历代码 包含日期时间 阴历

[javascript]代码库云代码,站长必备的高质量网页特效和广告代码。yuncode.net,站长js特效。 var lunarInfo=new Array( 0x04bd8,0x04ae0,0x0a570,0x054d5,0x0d260,0x0d950,0x16554,0x056a0,0x09ad0,0x055d2, 0x04ae0,0x0a5b6,0x0a4d0,0x0d250,0x1d255,0x0b540,0x0d6a0,0x0ada2…

对接亚马逊 SP-API(Amazon Selling Partner API) 第四章:签名

1. 前提概要 1.1. 如果打算使用 SDK 的&#xff0c;可跳过这一章 1.2. 本章作了解就可以了。具体 demo 参考下一章【Reports 模块】 1.3. 每个 HTTP 请求都需要将 Authorization 放在 Headers 中 2. Authorization 介绍 官方文档 https://github.com/amzn/selling-partner-…

SpringBoot源码解析(二)

SpringBoot的启动过程。我们可以看出一个SpringBoot。入口为SpringApplication.run方法&#xff0c; 第二步&#xff0c;根据RepositoryConfigurationDelegate读取配置文件信息。初始化配置。 第三步&#xff0c;o.s.cloud.context.scope.GenericScope 根据配置文件信息创建b…

HttpWebRequest 上传图片

public string HttpUploadFile(){string url "http://localhost:50380/WebForm1.aspx";string filepath "C:\\Users\\lei2.wang\\Desktop\\Capture.PNG";string fileformname "Capture.PNG";string poststr "";// 这个可以是改变的…

阳历日期转阴历工具类

直接上代码 public class DateUtill {final private static long[] lunarInfo new long[] { 0x04bd8, 0x04ae0,0x0a570, 0x054d5, 0x0d260, 0x0d950, 0x16554, 0x056a0, 0x09ad0,0x055d2, 0x04ae0, 0x0a5b6, 0x0a4d0, 0x0d250, 0x1d255, 0x0b540,0x0d6a0, 0x0ada2, 0x095b0, …

农历插件

<html> <head> <meta http-equiv"Content-Type" content"text/html; charsetgb2312"> <TITLE>带农历的日历</TITLE> <SCRIPT language"JavaScript"> <!-- var lunarInfonew Array( 0x04bd8,0…

k8s- HPA应用

部署 HPA HPA&#xff08;Horizontal Pod Autoscaling&#xff09;Pod 水平自动伸缩&#xff0c;Kubernetes 有一个 HPA 的资源&#xff0c;HPA 可以根据 CPU 利用率自动伸缩一个 Replication Controller、 Deployment 或者Replica Set 中的 Pod 数量。 &#xff08;1&#xf…