# 小团队本地报表数据如何先放进 SQLite：建表、批量导入、核对行数和事务提交

## 文档明确的机制

Python 标准库 `sqlite3` 提供符合 DB-API 2.0 的 SQLite 接口。SQLite 是一个轻量级、基于磁盘文件的数据库，不需要独立的服务器进程；应用可把它用于内部数据存储，也可先用它做原型，再迁移到 PostgreSQL、Oracle 等更大的数据库。对小团队把 CSV、Excel 清洗后的结构化记录先落地为本地 `.db` 文件，这一机制足够直接：调用 `sqlite3.connect("report.db")` 打开数据库文件；文件不存在时会隐式创建。返回值是 `Connection`，再用 `con.cursor()` 取得 `Cursor`，分别承担连接管理与 SQL 执行、取结果。

基本建表通过 `cur.execute()` 完成。官方教程示例为：

```python
cur.execute("CREATE TABLE movie(title, year, score)")
```

文档同时说明，SQLite 有灵活类型特性，示例中声明数据类型是可选的。但这只是数据库的类型处理方式，并不表示报表导入可以省略字段口径：订单日期、金额、客户标识、空值、去重规则等仍应由团队先定义清楚，否则后续汇总会把口径问题带进数据库。

插入结构化记录时，应使用 `?` 占位符，而不是用字符串格式化拼 SQL。官方教程的批量写法是：

```python
data = [
    ("Monty Python Live at the Hollywood Bowl", 1982, 7.9),
    ("Monty Python's The Meaning of Life", 1983, 7.5),
]
cur.executemany("INSERT INTO movie VALUES(?, ?, ?)", data)
con.commit()
```

文档明确提醒：始终使用占位符把 Python 值绑定到 SQL 语句，以避免 SQL 注入攻击。即使数据来自内部清洗后的列表，也不应把记录值直接拼进 SQL 字符串。

事务边界也由文档给出：`INSERT` 会隐式打开事务，必须调用连接对象的 `commit()` 后，修改才会保存到数据库。若导入中发现错误，可调用 `rollback()` 回滚当前待处理事务；全部结束后调用 `close()` 关闭连接。文档还提醒，应在关闭前提交，以免丢失待保存修改。

## 团队自行约定的接手建议

以下是团队接手导入任务时可自行约定的操作流程，不是 `sqlite3` 文档额外承诺的产品功能。

第一，先把输入固定为“记录列表加表结构”。例如清洗后的数据统一表示为元组列表，字段顺序与 `INSERT` 中的 `?` 顺序一致；表名、列名由脚本固定，不从普通记录值拼接。

第二，导入前先记录预期行数，导入后用 `COUNT(*)` 核对：

```python
cur.execute("SELECT COUNT(*) FROM report_rows")
print(cur.fetchone()[0])
```

再用样本查询抽查关键字段，例如查询最早、最晚记录或若干条样例，确认列顺序没有错位。官方教程也展示了用 `SELECT`、`fetchall()`、`fetchone()` 和遍历游标验证数据的方式。

第三，把批量插入、提交和异常处理分开。`executemany()` 成功后再 `commit()`；若数据不符合表定义或中途失败，执行 `rollback()`，最后无论成功与否都 `close()`。这样可以避免只写入一部分却被误当作完整导入。

第四，关闭后可重新 `connect()` 同一 `.db` 文件再查询一次。官方教程正是通过关闭连接、重新打开并查询，验证数据库已写入磁盘。这个检查能区分“当前连接里可见”和“文件已持久保存”。

## 边界与总结

本文范围只覆盖创建或打开 SQLite 文件、建表、用问号占位符批量插入、事务提交或回滚、查询核对和关闭连接；不扩展讨论费用、并发服务能力、自动重试或其他数据库迁移效果。SQLite 无需独立服务器，适合本地数据存储和原型开发，但是否迁移到更大的数据库应由实际任务决定。

还要注意两点：一是灵活类型不等于可以不设计数据口径，报表字段含义、空值和唯一性必须先约定；二是字符串拼接 SQL 有注入风险，记录值应通过 `?` 占位符绑定。对小团队而言，最小可靠路径就是：建表、批量导入、`COUNT` 与样本查询核对、成功才 `commit()`，失败则 `rollback()`，最后 `close()` 并重新打开验证。

## 相关工具

[AI 工作流 ROI 诊断器](/demos/ai-workflow-roi-diagnostic/index.html) · 查看工具的输入要求、输出说明与适用范围。


来源：[小团队本地报表数据如何先放进 SQLite：建表、批量导入、核对行数和事务提交](https://docs.python.org/3/library/sqlite3.html)
