You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用脚本自动化实现CSV更新SQLite3数据库:删旧表重建同架构表

嘿,这个问题我熟!确实,.mode csv和.import是sqlite3命令行工具的专属元命令,不是标准SQL语句,所以纯SQL脚本里根本没法跑。不过有几个靠谱的自动化方案,帮你搞定删除旧表、建新表、导入CSV的全流程:

方案1:用Shell/Batch脚本封装sqlite3命令行调用

这是最直接的方案,利用sqlite3命令行工具支持元命令的特性,把SQL操作和导入逻辑串在一起。

Linux/Mac下的Shell脚本示例

#!/bin/bash

# 替换成你的实际路径和表名
DB_FILE="your_database.db"
CSV_FILE="updated_data.csv"
TABLE_NAME="target_table"

# 调用sqlite3执行一系列命令
sqlite3 "$DB_FILE" <<EOF
-- 删除旧表(如果存在)
DROP TABLE IF EXISTS $TABLE_NAME;
-- 创建新表(替换成你原表的架构)
CREATE TABLE $TABLE_NAME (
    id INTEGER PRIMARY KEY,
    username TEXT NOT NULL,
    score INTEGER,
    join_date DATE
);
-- 切换CSV模式并导入数据
.mode csv
.import "$CSV_FILE" $TABLE_NAME
EOF

Windows下的Batch脚本示例

@echo off
set DB_FILE=your_database.db
set CSV_FILE=updated_data.csv
set TABLE_NAME=target_table

sqlite3.exe %DB_FILE% ^
"DROP TABLE IF EXISTS %TABLE_NAME%;" ^
"CREATE TABLE %TABLE_NAME% (id INTEGER PRIMARY KEY, username TEXT NOT NULL, score INTEGER, join_date DATE);" ^
".mode csv" ^
".import %CSV_FILE% %TABLE_NAME%"

这个方案轻量无依赖,只要你的系统里装了sqlite3命令行工具就能跑。

方案2:用Python脚本实现跨平台自动化

如果需要跨平台支持(Windows/Linux/Mac通吃),或者要处理更复杂的逻辑(比如动态读取原表架构),Python脚本是更好的选择。

import sqlite3
import csv

# 配置参数,替换成你的实际信息
DB_PATH = "your_database.db"
CSV_PATH = "updated_data.csv"
TABLE_NAME = "target_table"

# 连接数据库
conn = sqlite3.connect(DB_PATH)
cursor = conn.cursor()

# 1. 删除旧表
cursor.execute(f"DROP TABLE IF EXISTS {TABLE_NAME}")

# 2. 创建新表(这里可以替换成原表的架构,或者动态获取)
# 如果你想动态获取原表架构,可以从备份库或原库查询:
# cursor.execute(f"SELECT sql FROM sqlite_master WHERE type='table' AND name='{TABLE_NAME}'")
# create_table_sql = cursor.fetchone()[0]
create_table_sql = f"""
CREATE TABLE {TABLE_NAME} (
    id INTEGER PRIMARY KEY,
    username TEXT NOT NULL,
    score INTEGER,
    join_date DATE
)
"""
cursor.execute(create_table_sql)

# 3. 读取CSV并批量插入数据
with open(CSV_PATH, 'r', encoding='utf-8') as csv_file:
    csv_reader = csv.reader(csv_file)
    # 跳过CSV表头(如果你的CSV有表头的话)
    next(csv_reader)
    # 构造批量插入的占位符
    column_count = len(next(csv_reader))
    csv_file.seek(0)  # 重置文件指针到开头
    next(csv_reader)  # 再次跳过表头
    placeholders = ', '.join(['?'] * column_count)
    insert_sql = f"INSERT INTO {TABLE_NAME} VALUES ({placeholders})"
    # 批量插入,效率比单条插高很多
    cursor.executemany(insert_sql, csv_reader)

# 提交更改并关闭连接
conn.commit()
conn.close()

print("数据表更新完成!")

这个方案灵活性拉满,还能处理各种边缘情况(比如编码问题、数据校验)。

方案3:用SQLite的CSV虚拟表(适合高版本SQLite)

如果你的SQLite版本在3.39.0及以上,可以用内置的csv虚拟表,这样就能在纯SQL里完成导入了:

-- 删除旧表
DROP TABLE IF EXISTS target_table;
-- 创建新表(原架构)
CREATE TABLE target_table (
    id INTEGER PRIMARY KEY,
    username TEXT NOT NULL,
    score INTEGER,
    join_date DATE
);
-- 加载CSV扩展并导入数据
.load csv
-- header=1表示你的CSV文件包含表头,会自动匹配列
INSERT INTO target_table
SELECT * FROM csv('updated_data.csv', 'header=1');

注意:如果是用编程方式连接数据库(比如Python),需要先启用扩展加载:conn.enable_load_extension(True),否则会报错。


内容的提问来源于stack exchange,提问作者Josh Sharkey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:50:23