从.idx文件导数据到SQL遇ProgrammingError 1064(42000)报错求修复
修复MySQL INSERT语句语法错误的建议
错误原因分析
你遇到的ProgrammingError: 1064错误,根源是INSERT语句里的filenames字段值没有被单引号包裹。filenames的值是类似xxx.txt的字符串,MySQL要求字符串类型的字段值必须用单引号括起来,而你的代码里直接把文件名拼进SQL语句,导致语句变成VALUES(..., xxx.txt),违反了语法规则,所以报错提示near 'txt)'。
修复方案
方案1:修正字符串格式化写法
给filenames对应的占位符加上单引号,修改后的代码如下:
for row in content: if len(row)!= 0: row = row.strip('\n') if str(row).endswith(".txt"): columns = row.split("|") cik = columns[0] companyname = columns[1] formtype = columns[2] datefield = columns[3] filenames = columns[4] # 给filenames的占位符添加单引号 query= "INSERT class.firmsreports (cik, companyname, formtype, datefiled, filenames) VALUES ('%(1)s', '%(2)s', '%(3)s', '%(4)s', '%(5)s')" %{"1": cik, "2": companyname, "3": formtype, "4": datefield, "5": filenames}; cursor.execute(query) database.commit()
方案2:使用参数化查询(推荐)
字符串拼接SQL存在SQL注入风险,还容易出现转义问题,更安全的方式是用数据库驱动的参数化查询功能,让驱动自动处理字符串的引号和转义:
for row in content: if len(row)!= 0: row = row.strip('\n') if str(row).endswith(".txt"): columns = row.split("|") cik = columns[0] companyname = columns[1] formtype = columns[2] datefield = columns[3] filenames = columns[4] # 用%s作为占位符,参数放在execute的第二个参数元组中 query= "INSERT INTO class.firmsreports (cik, companyname, formtype, datefiled, filenames) VALUES (%s, %s, %s, %s, %s)" cursor.execute(query, (cik, companyname, formtype, datefield, filenames)) database.commit()
注意:这里的%s是MySQL驱动的参数占位符,不是Python字符串格式化符号,不需要加单引号;另外建议补上INSERT INTO关键字,部分MySQL版本要求必须书写该关键字。
内容的提问来源于stack exchange,提问作者Jordan Gaudineer
相关产品推荐
相关产品推荐

