Python加载CSV至MySQL遇语法错误:如何将局部变量newDate写入cmdels表?
解决LOAD DATA LOCAL INFILE写入局部变量到trans_dt字段的语法错误
你的问题核心是LOAD DATA语句的SET子句语法有误,再加上几处代码细节问题导致执行失败。下面是修正后的完整代码,以及关键修改点的详细解释:
修正后的完整代码
import mysql.connector import os # 提前定义new_Date函数,避免调用时出现未定义错误 def new_Date(s): return s[4:-4] config = { 'user': 'root', 'password': 'password', 'host': '127.0.0.1', 'database': 'nse', 'local_infile': True # 必须开启此项,否则LOAD DATA LOCAL会触发权限错误 } conn = mysql.connector.connect(**config) c = conn.cursor() def insertRows(fileName, c): delimiter = r',' file = fileName.split("/")[-1] if file.startswith("MTO"): newDate = new_Date(file) # 修正后的LOAD DATA语句:移除字段列表中的trans_dt,直接通过SET赋值变量 sql = """ LOAD DATA LOCAL INFILE %s INTO TABLE cmdels FIELDS TERMINATED BY %s IGNORE 4 LINES (recno, srno, symbol, series, qtytrd, qtydel, qtyper) SET trans_dt = %s """ c.execute(sql, (fileName, delimiter, newDate)) localExtractFilePath = "/Users/data/nse" for file in os.listdir(localExtractFilePath): if file.endswith(".DAT"): # 使用os.path.join拼接路径,适配不同操作系统 insertRows(os.path.join(localExtractFilePath, file), c) # Python3标准print函数格式 print(f"Loaded file {file} into database") conn.commit() c.close() conn.close()
关键修改点说明
修复
LOAD DATA语法错误- 你原来的
SET trans_dt=(@trans_dt,%s)是错误写法:既然你想用局部变量newDate填充trans_dt,而非读取文件中的对应列,直接在字段列表里移除trans_dt,再通过SET trans_dt = %s把变量值赋值给该字段即可。 - 如果你的文件中确实存在
trans_dt列但你不想使用,也可以写成(recno, srno, ..., @dummy_trans_dt),再通过SET trans_dt = %s跳过文件中的该列值。
- 你原来的
开启
local_infile配置- mysql-connector默认关闭了本地文件加载权限,必须在连接配置中添加
'local_infile': True,否则执行LOAD DATA LOCAL INFILE会抛出权限拒绝的错误。
- mysql-connector默认关闭了本地文件加载权限,必须在连接配置中添加
调整函数定义顺序
- 原来的
new_Date函数定义在insertRows之后,调用时会触发NameError,所以把它移到所有调用逻辑之前。
- 原来的
Python语法兼容优化
- 把Python2风格的
print "Loaded..."改成Python3标准的print(f"Loaded...")格式,避免语法错误。 - 使用
os.path.join拼接文件路径,比手动拼接/更安全,能适配Windows、Linux等不同操作系统的路径规则。
- 把Python2风格的
这样修改后,就能顺利把newDate的值写入cmdels表的trans_dt字段了。
内容的提问来源于stack exchange,提问作者Gower
相关产品推荐
相关产品推荐

