我正在尝试用 MYSQL 中的 XML 字符串填充列。当我运行 python 脚本时,出现以下错误。我使用文件名作为 id,我相信我以某种方式错误地解析了 XML。
mysql.connector.errors.ProgrammingError: 1064 (42000): 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,了解在 ' 附近使用的正确语法
cursor = cnx.cursor(buffered=True)
tree = ET
for a in os.listdir(mydir):
if a.endswith(".xml"):
print os.path.basename(a)
j=ET.parse(mydir+"/"+a)
a = ''.join(a.split())
a = a[:-9]
root = j.getroot()
xmlstr = ET.tostring(root, encoding='utf8')
xmlstr
print a
query = """UPDATE %s.%s SET col1= (%s) WHERE col2 = (%s)""" % (mysql_db,mysql_table,xmlstr,a)
cursor.execute(query)
你知道什么是错误吗?
当我在执行之前打印查询时,我得到以下内容
UPDATE triageprediction.triagepredictionsamples SET CtXml= (<?xml version='1.0' encoding='utf8'?>
<CAS version="2">
<uima.cas.Sofa _id="3" _indexed="0" mimeType="text" sofaID="_InitialView" sofaNum="1" sofaString="The Enmore Practice
more xml.....
</uima.cas.FSArray>
</CAS>) WHERE REFERRALID = (1187116)
Traceback (most recent call last):
File "C:\XML_Formatter_v2\loadxml.py", line 47, in <module>
cursor.execute(query)
File "C:\Python27\lib\site-packages\mysql\connector\cursor.py", line 551, in execute
self._handle_result(self._connection.cmd_query(stmt))
File "C:\Python27\lib\site-packages\mysql\connector\connection.py", line 490, in cmd_query
result = self._handle_result(self._send_cmd(ServerCmd.QUERY, query))
File "C:\Python27\lib\site-packages\mysql\connector\connection.py", line 395, in _handle_result
raise errors.get_exception(packet)
mysql.connector.errors.ProgrammingError: 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '2">
<uima.cas.Sofa _id="3" _indexed="0" mimeType="text" sofaID="_InitialView' at line 1
最佳答案
看来您的问题在于将参数放入查询中的方式。目前,您正在使用字符串格式,这不仅是危险的(请参阅 SQL injections ),而且也是正确放置引号、转义和数据类型转换时出现问题的根源。
您应该使用参数化查询:
query = """
UPDATE
{db}.{table}
SET
col1 = %s
WHERE
col2 = %s""".format(db=mysql_db, table=mysql_table)
cursor.execute(query, (xmlstr, a))
请注意 xmlstr
和 a
如何分别传递给 execute()
。另请注意,我们没有在 %s
占位符周围放置任何内容 - MySQL 数据库驱动程序将自动处理引用和转义。
但是,我们无法参数化数据库、表和列名称,为此,我们将使用字符串格式。不过,请确保正确清理 mysql_db
和 mysql_table
变量值。
关于python - mysql.connector.errors.ProgrammingError : 1064 (42000) & XML parsing,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41248510/