程序跑起来容易,数据持久化才是关键。从零配置的 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 看查询计划,数据库能力就扎实了。