CSV文件名映射表名应统一小写、下划线替换非字母数字字符、加前缀防冲突,并检查表是否存在;列类型需显式指定,避免pandas自动推断失准;主键冲突需提前补全或用数据库原生语法处理;不同数据库导入策略须差异化配置。
CSV文件名怎么映射成表名才不会出错
直接用文件名当表名最常见,但user_data_v2.csv这种带版本号的,或sales-2024-q1.csv这种含分隔符的,会触发sql语法错误或被截断。数据库表名不支持-、.、v2开头、空格,也不区分大小写(mysql默认),所以userdata.csv和userdata.csv可能撞表。
实操建议:
- 统一小写 + 下划线替换非字母数字字符:
re.sub(r'[^a-z0-9]+', '_', Path(filename).stem.lower()) - 加前缀防冲突,比如
csv_import_开头,避免覆盖业务表 - 检查是否已存在同名表(
SELECT 1 FROM information_schema.tables WHERE table_schema = 'your_db' AND table_name = 'xxx'),跳过或加时间戳后缀 - 别依赖原始文件名里的“日期”字段自动建分区表——那是后续ETL逻辑,导入阶段只做基础映射
Pandas read_csv读取时列类型推断失准怎么办
默认dtype='object'看似安全,但会导致数值列变字符串、NULL识别失败;设infer_dtype=True又容易把含空值的整数列判成float64,后续写入MySQL报Field 'xxx' doesn't have a default value。
实操建议:
- 显式传
dtype字典,用pd.Int64Dtype()(支持NaN的整型)或string(pandas 1.0+)替代object - 对疑似日期列,用
parse_dates=['col1', 'col2']并配date_parser处理不规范格式(如'2024/03/15'或'15-Mar-2024') - 遇到混合类型列(如一列里有
'123'和'N/A'),先keep_default_na=False,再用astype(str)兜底,别让pandas自己猜 - 大文件记得加
chunksize,否则内存爆掉,且每块都要重做类型对齐
用to_sql批量写入多个表时主键/索引冲突怎么绕开
if_exists='replace'会删表重建,丢失索引、外键、注释;'append'又要求表结构完全一致,字段顺序、类型、NOT NULL约束差一点就报错,比如CSV里某列全空,pandas推成float64,但目标表是INT NOT NULL。
使用 qbo-mileage CLI 及用户凭证,从 Airtable、Outlook 或 Google Calendar 记录生成 QuickBooks Online 里程 CSV 文件。
实操建议:
- 导入前先用
pd.DataFrame.dtypes比对目标表结构(查information_schema.columns),不匹配就报错退出,别硬插 - 需要追加数据且字段可能变化?改用
INSERT IGNORE或ON DUPLICATE KEY UPDATE(MySQL)配合executemany,别走to_sql - 主键冲突不是因为数据重复,而是CSV里没给主键值?那就提前用
df.insert(0, 'id', range(1, len(df)+1))补自增列,但注意别和已有主键冲突 - SQLite下
to_sql不支持if_exists='upsert',得手写INSERT OR REPLACE INTO语句
不同数据库对CSV导入的兼容性差异在哪
PostgreSQL的COPY命令最快,但不支持自动建表;MySQL的LOAD DATA INFILE能跳过SQL解析,但要求文件在服务端磁盘;SQLite根本没原生命令,全靠Python读完再插——这些差异直接影响你该不该用pandas中转。
实操建议:
- 数据量 > 10万行,优先用数据库原生命令:
psql -c "\COPY table_name FROM 'file.csv' WITH CSV HEADER"(PostgreSQL) - MySQL本地文件路径必须是服务端可读路径,
LOCAL INFILE要客户端和服务端都开启,且secure_file_priv限制严格,不如pandas稳妥 - SQLite单次插入超500行就明显变慢,用
executemany配PRAGMA journal_mode = WAL能提一倍速 - 别在脚本里硬编码数据库类型分支,抽成配置项:
db_config = {'engine': 'postgresql', 'use_copy': True}
表名推导规则、列类型对齐、主键策略、数据库适配——这四点只要漏掉一个,批量导入就会卡在某个文件上不动,而且错误信息往往藏在中间日志里,不容易定位。最麻烦的是混合了大小写敏感和不敏感的环境,比如开发用macOS(SQLite默认大小写敏感),上线到Linux MySQL(默认不敏感),同一套文件名映射逻辑就失效。










