每天学习一点Python——SQLite数据库操作入门
大家好!今天我们来学习Python中内置的轻量级数据库SQLite。通过Jupyter Notebook的实战演示,让我们一步步掌握数据库操作的核心概念。
一、连接数据库并获取时间
第一步:导入模块并建立连接
代码:
import sqlite3
connection = sqlite3.connect("test_database.db")
type(connection)
逐行讲解:
import sqlite3
- • 这行代码导入了Python内置的SQLite数据库模块
connection = sqlite3.connect("test_database.db")
- •
sqlite3.connect()是连接数据库的函数 - •
"test_database.db"是数据库文件名,如果当前目录下没有这个文件,Python会自动创建它 - • 函数执行后会返回一个Connection对象,我们把它赋值给
connection变量 - • 这个
connection变量代表程序与数据库之间的连接通道
type(connection)
- • 这行代码用来查看
connection变量的数据类型 - • 在Jupyter中直接输入变量名或表达式,就会显示它的值
执行结果:
sqlite3.Connection
结果说明: 输出显示connection是sqlite3.Connection类型的对象,证明我们成功建立了数据库连接。
第二步:创建Cursor对象
代码:
cursor = connection.cursor()
type(cursor)
逐行讲解:
cursor = connection.cursor()
- •
connection.cursor()是Connection对象的一个方法,用来创建Cursor对象 - • Cursor可以理解为操作数据库的"手"或"光标"
- • 我们要通过Cursor来执行SQL语句和获取查询结果
- • 创建好的Cursor对象赋值给
cursor变量
type(cursor)
执行结果:
sqlite3.Cursor
结果说明: 输出显示cursor是sqlite3.Cursor类型的对象,证明Cursor创建成功,可以开始操作数据库了。
第三步:编写并执行SQL查询
代码:
query = "SELECT datetime('now','localtime');"
results = cursor.execute(query)
results
逐行讲解:
query = "SELECT datetime('now','localtime');"
- • 这行代码定义了一个字符串变量,名字叫
query - • 字符串的内容是一条SQL查询语句,作用是从数据库获取当前时间
- •
datetime('now','localtime')是SQLite的内置函数: - •
'localtime'告诉数据库转换成本地时区
- • 整条语句以分号
;结尾,这是SQL语句的规范写法
results = cursor.execute(query)
- •
cursor.execute()是Cursor对象的方法,用来执行SQL语句 - • 这行代码的意思是:用cursor去执行query里面的SQL命令
- • 执行后会返回Cursor对象本身,我们把这个返回值赋值给
results变量
results
执行结果:
<sqlite3.Cursor at 0x288da395ac0>
结果说明: 输出显示results是一个Cursor对象。注意:这里显示的并不是时间数据,而是一个Cursor对象的引用。后面的十六进制数是它在计算机内存中的地址。
第四步:获取查询结果
代码:
row = results.fetchone()
row
逐行讲解:
row = results.fetchone()
- •
fetchone()是Cursor对象的方法,用来从查询结果中获取一行数据 - • 每次调用
fetchone()都会返回结果数据集的下一行 - • 返回的数据是一个元组,元组里的每个元素对应一列的值
row
执行结果:
('2026-02-20 14:47:14',)
结果说明: 输出显示一个元组,里面有一个元素'2026-02-20 14:47:14'。因为我们的查询只选了一列(时间),所以元组里只有一个元素。
💡 小Tip:注意到元组中最后的逗号了吗?单元素元组无论创建还是显示,都必须有那个逗号,这样才能和普通的括号表达式区分开。
第五步:提取具体数值
代码:
time = row[0]
time
逐行讲解:
time = row[0]
- •
row是一个元组,row[0]表示取元组的第一个元素 - • 在Python中,元组的索引从0开始,所以
row[0]就是第一个元素
time
执行结果:
'2026-02-20 14:47:14'
结果说明: 现在显示的是纯字符串格式的时间值,已经从元组中成功提取出来了。
第六步:关闭数据库连接
代码:
connection.close()
逐行讲解:
connection.close()
- •
close()是Connection对象的方法,用来关闭数据库连接,释放系统占用的资源 - • 如果不关闭连接,程序运行结束后可能还会占用内存和文件句柄
二、使用with语句自动管理连接
with语句的优雅写法
代码:
with sqlite3.connect("test_database.db") as connection:
cursor = connection.cursor()
query = "SELECT datetime('now','localtime');"
results = cursor.execute(query)
row = results.fetchone()
time = row[0]
time
逐行讲解:
with sqlite3.connect("test_database.db") as connection:
- •
with是Python的关键字,用来创建上下文管理器 - •
sqlite3.connect("test_database.db")创建数据库连接 - •
as connection把连接对象赋值给connection变量 - • 这一行的末尾有冒号
:,表示下面缩进的代码都属于这个with代码块 - • 重要特性:当
with代码块执行完后,Python会自动关闭连接并提交事务,不需要手动写close()和commit()
第2-6行(缩进部分):
- •
cursor = connection.cursor():创建Cursor对象 - •
query = "SELECT datetime('now','localtime');":定义SQL查询语句 - •
results = cursor.execute(query):执行SQL查询 - •
row = results.fetchone():获取第一行数据
time
执行结果:
'2026-02-20 14:50:49'
结果说明: 虽然with代码块执行完后数据库连接已经自动关闭,但变量time是普通的Python变量,它仍然存在,所以可以在外面正常使用。
💡 小Tip:使用with语句管理数据库连接是最佳实践!它不仅能自动关闭连接,还会自动提交事务,避免因忘记写commit()或close()导致的各种问题。
三、创建表和插入数据
不使用with语句的完整操作
代码:
# 要创建的表
create_table = """
CREATE TABLE People(
FirstName TEXT,
LastName TEXT,
Age INT
);
"""
# 插入多条数据
insert_values = """
INSERT INTO People VALUES
('Ron', 'Obvious', 42),
('Luigi', 'Vercotti', 43),
('Arthur', 'Belling', 28);
"""
connection = sqlite3.connect("test_database.db")
cursor = connection.cursor()
cursor.execute(create_table)
cursor.execute(insert_values)
connection.commit()
connection.close()
逐行讲解:
定义创建表的SQL语句:
create_table = """
CREATE TABLE People(
FirstName TEXT,
LastName TEXT,
Age INT
);
"""
- • 使用三重引号
"""定义多行字符串,赋值给变量create_table - •
CREATE TABLE People:创建一个名为People的表 - •
FirstName TEXT:姓名字段,数据类型是文本 - •
LastName TEXT:名字字段,数据类型是文本
- • 每个字段定义用逗号分隔,最后一个后面不需要逗号
定义插入数据的SQL语句:
insert_values = """
INSERT INTO People VALUES
('Ron', 'Obvious', 42),
('Luigi', 'Vercotti', 43),
('Arthur', 'Belling', 28);
"""
- • 使用三重引号定义多行字符串,赋值给变量
insert_values - •
INSERT INTO People VALUES:向People表中插入数据 - • 后面跟着三组值,每组用括号括起来,用逗号分隔:
- • 第一组:
('Ron', 'Obvious', 42),对应FirstName、LastName、Age - • 第二组:
('Luigi', 'Vercotti', 43) - • 第三组:
('Arthur', 'Belling', 28)
- • 注意:这是一种SQL语法,一条语句插入多条数据,比多次执行
INSERT效率更高
执行操作的代码:
connection = sqlite3.connect("test_database.db")
cursor = connection.cursor()
cursor.execute(create_table)
cursor.execute(insert_values)
connection.commit()
- • 非常重要:如果不调用
commit(),表和数据都不会真正保存到硬盘上
connection.close()
💡 小Tip:在SQL语句中,字符串值必须用单引号括起来!这是SQL语法规则,和Python可以用双引号不同。比如'Ron'是正确的,"Ron"在SQL中可能会出错。
验证数据插入
代码:
connection = sqlite3.connect("test_database.db")
cursor = connection.cursor()
query = "SELECT * FROM People;"
results = cursor.execute(query)
results.fetchall()
逐行讲解:
connection = sqlite3.connect("test_database.db")
cursor = connection.cursor()
query = "SELECT * FROM People;"
- •
SELECT *中的*是通配符,表示选择所有列 - •
FROM People表示从People表中查询 - • 整条语句的意思是:从People表中取出所有列的所有数据
results = cursor.execute(query)
results.fetchall()
- •
fetchall()方法获取查询结果中的所有行 - • 返回的是一个列表,列表中的每个元素是一个元组,代表一行数据
执行结果:
[('Ron', 'Obvious', 42),
('Luigi', 'Vercotti', 43),
('Arthur', 'Belling', 28)]
结果说明: 输出显示一个列表,包含三个元组。每个元组对应一条记录,顺序就是插入时的顺序。这证明数据插入成功了。
删除表
代码:
cursor.execute("DROP TABLE People;")
connection.commit()
connection.close()
逐行讲解:
cursor.execute("DROP TABLE People;")
- •
DROP TABLE People会永久删除整个People表,包括表里的所有数据
connection.commit()
connection.close()
💡 小Tip:connection.close(不加括号)只是引用这个函数,不会执行关闭操作。正确的写法应该是connection.close()(加括号)。这是一个非常容易犯的错误!
四、使用with语句重新实现
用with语句创建表和插入数据
代码:
with sqlite3.connect("test_database.db") as connection:
cursor = connection.cursor()
cursor.execute(create_table)
cursor.execute(insert_values)
逐行讲解:
with sqlite3.connect("test_database.db") as connection:
cursor = connection.cursor()
cursor.execute(create_table)
- • 执行创建表的SQL语句(使用之前定义的
create_table变量)
cursor.execute(insert_values)
- • 执行插入数据的SQL语句(使用之前定义的
insert_values变量)
不需要写commit()和close():当with代码块执行完毕后,Python会自动提交事务并关闭连接。
验证插入结果
代码:
connection = sqlite3.connect("test_database.db")
cursor = connection.cursor()
query = "SELECT * FROM People;"
results = cursor.execute(query)
results.fetchall()
执行结果:
[('Ron', 'Obvious', 42), ('Luigi', 'Vercotti', 43), ('Arthur', 'Belling', 28)]
结果说明: 和之前一样,证明with语句同样成功创建了表并插入了数据。
五、fetchone()与fetchall()对比
fetchone()的工作原理
假设我们执行了SELECT * FROM People查询,结果有三行数据:
| | | |
|---|
| fetchone() | | ('Ron', 'Obvious', 42) |
| fetchone() | | ('Luigi', 'Vercotti', 43) |
| fetchone() | | ('Arthur', 'Belling', 28) |
| fetchone() | | None |
形象理解:fetchone()就像书签,每调用一次就向下移动一行,不能倒退。如果已经读到末尾,再调用就会返回None。
处理多行数据的方法对比
| | | | |
|---|
fetchall() | all_rows = cursor.fetchall() | | | |
fetchmany(n) | rows = cursor.fetchmany(100) | | | |
| for row in cursor: | 通用推荐 | | |
推荐写法:
cursor.execute("SELECT * FROM People")
for row in cursor:
print(row)
这种写法不需要手动调用fetchone(),Python会自动逐行处理,无论有多少行数据都能优雅处理。
六、核心知识点速查表
| | | |
|---|
| sqlite3.connect() | | |
| connection.cursor() | | |
| cursor.execute() | | |
| fetchone() | | |
| fetchall() | | |
| fetchmany(n) | | |
| connection.commit() | | |
| connection.close() | | |
📦 资源获取提示
关注「码农自习室」,后台回复关键词 Python学习,即可获取本文完整代码及配套练习数据集,一起动手掌握高效数据操作的核心技巧!
❤️ 支持我们
如果觉得本文对你有帮助,欢迎点赞 + 推荐 + 关注,您的支持是我们持续创作优质内容的最大动力!
📚 学习资源说明
本文内容整理自《Python基础教程(第3版)》第15章,所有命令均已实测。
让我们一起坚持学习,每天进步一点点!💪