【小学生都能看懂的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]}")

四、实战演练:个人图书管理系统

功能说明

  1. 添加新书
  2. 按条件查询书籍
  3. 更新书籍信息
  4. 删除书籍

完整代码示例

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冷知识档案馆

  1. 数据类型亲和性:SQLite采用动态类型,但建议使用标准的INTEGER、TEXT等类型
  2. 内存数据库:使用:memory:作为文件名可创建内存数据库,适合临时数据处理
    conn = sqlite3.connect(':memory:')  # 创建一个瞬态数据库
    
  3. 备份技巧:直接复制.db文件即可备份数据库,像保存普通文件一样简单
  4. 最大支持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)
posted @   爱上编程技术  阅读(7)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示