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

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()

关键修改点说明

  1. 修复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跳过文件中的该列值。
  2. 开启local_infile配置

    • mysql-connector默认关闭了本地文件加载权限,必须在连接配置中添加'local_infile': True,否则执行LOAD DATA LOCAL INFILE会抛出权限拒绝的错误。
  3. 调整函数定义顺序

    • 原来的new_Date函数定义在insertRows之后,调用时会触发NameError,所以把它移到所有调用逻辑之前。
  4. Python语法兼容优化

    • 把Python2风格的print "Loaded..."改成Python3标准的print(f"Loaded...")格式,避免语法错误。
    • 使用os.path.join拼接文件路径,比手动拼接/更安全,能适配Windows、Linux等不同操作系统的路径规则。

这样修改后,就能顺利把newDate的值写入cmdels表的trans_dt字段了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:02:47