程序跑起来容易,数据持久化才是关键。从零配置的 SQLite 到生产级的 MySQL,Python 的数据库接口高度统一:连接、游标、执行 SQL、提交。本文以 SQLite 为主线,带你掌握增删改查的完整套路。
1. 连接 SQLite
SQLite 是零配置的嵌入式数据库,Python 标准库 sqlite3 直接可用,适合入门和原型开发:
import sqlite3
conn = sqlite3.connect("app.db") # 文件不存在会自动创建
cur = conn.cursor()
cur.execute("SELECT sqlite_version()")
print(cur.fetchone()) # ('3.x.x',)
conn.close()
2. 建表与插入数据
import sqlite3
conn = sqlite3.connect("app.db")
cur = conn.cursor()
cur.execute("""
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
age INTEGER
)
""")
cur.execute("INSERT INTO users (name, age) VALUES (?, ?)", ("Ada", 18))
conn.commit() # 别忘了提交!
conn.close()
3. 查询与参数化
永远用 ? 占位符传参,绝对不要拼接字符串,这是防 SQL 注入的第一原则:
conn = sqlite3.connect("app.db")
cur = conn.cursor()
# 参数化查询,返回所有行
rows = cur.execute("SELECT * FROM users WHERE age >= ?", (18,)).fetchall()
# 也可以按字典传参
cur.execute(
"INSERT INTO users (name, age) VALUES (:name, :age)",
{"name": "Bob", "age": 20},
)
conn.commit()
conn.close()
4. 更新与删除
conn = sqlite3.connect("app.db")
cur = conn.cursor()
cur.execute("UPDATE users SET age = ? WHERE name = ?", (19, "Ada"))
cur.execute("DELETE FROM users WHERE age < ?", (18,))
print("影响行数:", cur.rowcount)
conn.commit()
conn.close()
5. 事务与上下文管理
把连接当上下文管理器用:正常退出自动提交,抛出异常自动回滚:
import sqlite3
conn = sqlite3.connect("app.db")
try:
with conn: # 成功提交,异常回滚
conn.execute("INSERT INTO users (name, age) VALUES (?, ?)",
("Carol", 25))
conn.execute("INSERT INTO users (name, age) VALUES (?, ?)",
("Dave", 30))
except sqlite3.Error as e:
print("数据库错误:", e)
finally:
conn.close()
6. 连接 MySQL / PostgreSQL
生产环境常用 MySQL 或 PostgreSQL,驱动分别是 pymysql 和 psycopg,接口与 sqlite3 高度相似:
pip install pymysql psycopg2-binary
import pymysql
conn = pymysql.connect(
host="127.0.0.1", user="root", password="xxx",
database="app", charset="utf8mb4",
)
cur = conn.cursor()
cur.execute("SELECT COUNT(*) FROM users")
print(cur.fetchone())
conn.close()
进阶推荐 SQLAlchemy ORM:不用手写 SQL,还能无缝切换不同数据库。
💡 学习建议:建一个"记账本"小项目,把增删改查全部过一遍;再学点 SQL 基础(JOIN、索引),配合 EXPLAIN 看查询计划,数据库能力就扎实了。