📄 一句话概括
驱动程序/第三方库=程序与数据库之间的翻译官:你写自己的语言(Python/Java/PHP),它替你把命令译成 SQL 走网络发过去——没有它,程序不认识数据库。
📝 本节和前面几节的关系
8-2 看的是别人家的应用,本节自己动手:程序里想连数据库,靠的不是喊话,而是先装一个库。C++ 课的第十五章(文件操作)讲过「函数库怎么装怎么用」——数据库驱动就是同一件事,只是对方换成了数据库进程。
一、为什么需要驱动
- 你的程序(进程 A)和数据库(进程 B)是两个进程,靠网络协议(或 socket)对话
- 直接说协议太底层——驱动程序把协议封装成你语言里的函数:
# Python:pip install 后 import,就是「第三方库」
import sqlite3
conn = sqlite3.connect("book_review.db") # 连接(8-1 四要素的本地版)
cur = conn.cursor()
cur.execute("SELECT * FROM books WHERE id = ?", (1,)) # ? 占位=参数化(7-10!)
row = cur.fetchone()
conn.close() # 用完关连接(第三章 close() 老朋友)
- 各语言全家桶:Python 的
sqlite3/mysql-connector、Java 的 JDBC、PHP 的 PDO、Node 的 mysql2——名字不同,套路相同:连 → 执行 → 取结果 → 关
二、所有驱动共同的四步舞
- 建立连接(花销大!所以后面 8-6 有连接池)
- 发送 SQL / 调用方法
- 取回结果(游标/结果集)
- 关闭连接——忘了关=连接泄漏(7-5 资源不足的常见根因)
三、动手 Demo:Python 跑通「连-查-关」四步舞
# 在线 Python 运行器即可(sqlite3 是标准库,不用装)
import sqlite3
conn = sqlite3.connect(":memory:") # 内存库,随用随建
cur = conn.cursor()
cur.execute("CREATE TABLE books (id INTEGER PRIMARY KEY, title TEXT)")
cur.execute("INSERT INTO books VALUES (1, '数据库入门')")
conn.commit() # 事务提交(4-15)——别忘了
cur.execute("SELECT title FROM books WHERE id = ?", (1,))
print(cur.fetchone()) # ('数据库入门',)
conn.close() # 第 4 步:关
【准备块】在线 Python 运行器(非 SQL 运行器);四步舞少一步都不行。
四、30 秒实验
把驱动想成「客服接线员」:你说中文(Python),对方说英语(SQL 协议),接线员双向翻译。挂电话(close)是礼貌也是资源——占线不挂,别的电话打不进来(连接数满,7-5)。
五、常见误区
- 「驱动里执行的 SQL 和命令行不一样」:一模一样——驱动只是搬运工,SQL 语义全不变(第三章的功夫全数适用)
- 「连接用完不关,反正会回收」:泄漏累积到连接上限,全站报错(7-5);长程序必须有连接池
- 「在驱动里手拼 SQL 字符串」:这是注入(7-10)的头号来源——永远用占位符参数化
自测三问
1. 驱动程序解决什么问题?(程序进程与数据库进程之间的协议翻译——封装成语言函数) 2. 驱动的四步舞?(连接→执行→取结果→关闭;连接昂贵,忘了关会泄漏) 3. Python 里 `?` 占位符的意义?(参数化查询——防 7-10 SQL 注入的治本手段)- ☐ 下一节(8-4 O/R映射、O/R映射器-以编程语言的格式操作数据库)
相关笔记
- SQL注入-从外部操作数据库的问题 — 占位符参数化正是治注入的药
- COMMIT-执行一组处理 — conn.commit() 就是它
- O/R映射、O/R映射器-以编程语言的格式操作数据库 — 下一节:连 SQL 都不写,直接操作对象
- 🗄️ 数据库基础 · 索引 — 全课路线图