【小学生都能看懂的Python入门教程】第八章:SQLite——小而美的数据存储:Python程序员的口袋数据库
SQLite——小而美的数据存储:Python程序员的口袋数据库
一、SQLite简介:数据库界的瑞士军刀
1. 轻如鸿毛,快如闪电
SQLite是一个嵌入式数据库,就像:
- 数据收纳袋:无需服务器,直接存储在文件中
- 数字记事本:随时随地记录数据
- 程序员的USB:即插即用,无需复杂配置
核心特点:
features = {
"零配置": "无需安装,不用启动服务",
"单文件存储": "整个数据库就是一个文件",
"跨平台": "能在手机、电脑、IoT设备运行",
"支持SQL": "和其他数据库说同一种语言"
}
适用场景:
- 移动应用(如微信的聊天记录存储)
- 浏览器(Chrome用它存历史记录)
- 小型网站
- 桌面应用(如WPS的配置存储)
冷知识:全球每天有超过1万亿个SQLite数据库在运行——平均每人每天使用130次!
二、连接SQLite:Python的魔法钥匙
1. 开启数据宝箱
Python自带sqlite3
模块,无需额外安装:
import sqlite3
# 连接数据库(不存在则创建)
conn = sqlite3.connect('my_library.db') # 文件扩展名也可以是.sqlite3
cursor = conn.cursor() # 获取游标(数据指针)
连接小剧场:
你:import sqlite3
Python:钥匙已就位!
你:connect('my_library.db')
SQLite:检测到新宝箱,正在刻制锁孔…
宝箱开启成功!获得成就【初级守宝人】
三、SQL基础操作:与数据库对话的咒语
1. 创建数据表:打造书架
cursor.execute('''CREATE TABLE IF NOT EXISTS books
(id INTEGER PRIMARY KEY AUTOINCREMENT,
title TEXT NOT NULL,
author TEXT,
year INTEGER)''')
conn.commit() # 保存变更
SQL语法解析:
CREATE TABLE
:建造新书架IF NOT EXISTS
:防止重复建造PRIMARY KEY
:每本书的唯一编号AUTOINCREMENT
:自动生成编号
2. 插入数据:摆放书籍
books = [
('Python编程:从入门到实践', 'Eric Matthes', 2016),
('流畅的Python', 'Luciano Ramalho', 2017),
('代码大全', 'Steve McConnell', 1993)
]
cursor.executemany('INSERT INTO books (title, author, year) VALUES (?,?,?)', books)
conn.commit()
防SQL注入技巧:使用?
占位符而不是字符串拼接,就像用密码锁代替普通挂锁
3. 查询数据:查找书籍
# 查询所有书籍
cursor.execute("SELECT * FROM books")
all_books = cursor.fetchall()
print("馆藏清单:")
for book in all_books:
print(f"{book[0]}. 《{book[1]}》 - {book[2]} ({book[3]}年)")
# 条件查询
cursor.execute("SELECT title FROM books WHERE year > 2000")
new_books = cursor.fetchall()
print("\n21世纪新书:")
for title in new_books:
print(f"- {title[0]}")
四、实战演练:个人图书管理系统
功能说明
- 添加新书
- 按条件查询书籍
- 更新书籍信息
- 删除书籍
完整代码示例
import sqlite3
from datetime import datetime
class BookManager:
def __init__(self, db_name='library.db'):
self.conn = sqlite3.connect(db_name)
self.cursor = self.conn.cursor()
self._create_table()
def _create_table(self):
"""创建书籍表"""
self.cursor.execute('''CREATE TABLE IF NOT EXISTS books
(id INTEGER PRIMARY KEY AUTOINCREMENT,
title TEXT NOT NULL,
author TEXT,
year INTEGER,
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP)''')
self.conn.commit()
def add_book(self, title, author, year=None):
"""添加新书"""
current_year = datetime.now().year
year = year or current_year
self.cursor.execute(
"INSERT INTO books (title, author, year) VALUES (?,?,?)",
(title, author, year)
)
self.conn.commit()
print(f"《{title}》已入库!")
def search_books(self, keyword=None, min_year=None):
"""搜索书籍"""
query = "SELECT * FROM books"
conditions = []
params = []
if keyword:
conditions.append("title LIKE ? OR author LIKE ?")
params.extend([f'%{keyword}%']*2)
if min_year:
conditions.append("year >= ?")
params.append(min_year)
if conditions:
query += " WHERE " + " AND ".join(conditions)
self.cursor.execute(query, params)
return self.cursor.fetchall()
def delete_book(self, book_id):
"""删除书籍"""
self.cursor.execute("DELETE FROM books WHERE id=?", (book_id,))
self.conn.commit()
print(f"ID为{book_id}的书籍已下架")
def __del__(self):
"""关闭数据库连接"""
self.conn.close()
# 使用示例
if __name__ == "__main__":
manager = BookManager()
# 添加示例书籍
manager.add_book("SQLite权威指南", "张三", 2020)
manager.add_book("Python数据科学手册", "李四")
# 搜索书籍
print("\n搜索结果:")
results = manager.search_books(keyword="Python", min_year=2010)
for book in results:
print(f"{book[0]}. {book[1]} - {book[2]} ({book[3]})")
# 删除书籍(假设要删除id为1的书)
# manager.delete_book(1)
五、SQLite冷知识档案馆
- 数据类型亲和性:SQLite采用动态类型,但建议使用标准的INTEGER、TEXT等类型
- 内存数据库:使用
:memory:
作为文件名可创建内存数据库,适合临时数据处理conn = sqlite3.connect(':memory:') # 创建一个瞬态数据库
- 备份技巧:直接复制.db文件即可备份数据库,像保存普通文件一样简单
- 最大支持140TB数据:虽然小巧,但能处理海量数据(不过你的硬盘可能先撑不住)
为什么SQLite适合学习?
就像学自行车不用先造公路——它让你专注学习SQL本身,而不是数据库管理
六、常见问题诊疗室
症状:OperationalError: database is locked
药方:确保每次操作后提交事务,及时关闭连接
症状:中文乱码
药方:创建连接时指定编码(但SQLite默认UTF-8,通常不需要)
症状:忘记commit导致数据丢失
药方:像保存游戏进度一样养成commit习惯
结语:从数据流浪汉到存储大师
现在你已经掌握:
✅ SQLite的核心优势
✅ Python操作SQLite的完整流程
✅ 常用SQL操作技巧
✅ 完整图书管理系统的开发
当你能用不到100行代码实现数据持久化功能时,就真正体会到了SQLite"小而美"的哲学。记住,好的数据存储就像整理书包——不需要豪华保险箱,只要合适的分层和便捷的存取。
下期预告:《SQLAlchemy——与数据库的“心灵交流”:Python程序员的读心术秘籍》
课后彩蛋:在BookManager类中添加以下方法:
def get_oldest_book(self):
"""获取最早出版的书籍"""
self.cursor.execute("SELECT * FROM books ORDER BY year ASC LIMIT 1")
return self.cursor.fetchone()
# 试试看找出你的"镇馆之宝"
数据库文件 → 表(Tables) → 记录(Rows) → 字段(Columns)
代码学习,前言技术分享,深度分析编程技术,普及科普编程技术,天天都要敲代码
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)