在执行insert查询时,Connector/python有一个小问题。
我有将数据插入数据库的功能。参数数据是元组列表:[2652884,'http://www.example.com/','5.0.5.239',1),.]
def insert_url(self, data):
query = "INSERT INTO `sp_urls` (`parent_id`, `url`, `version`, `hits`) VALUES (%d, %s, %s, %d) ON DUPLICATE KEY UPDATE url=url"
try:
cursor = self.__cnx.cursor()
cursor.executemany(query, data)
except (mysql.connector.errors.IntegrityError) as err:
print("Query syntax error:", err, file=sys.stderr)
except (mysql.connector.errors.ProgrammingError) as err:
print("Programming err:{0}".format(err))
finally:
cursor.close()查询本身工作,在self.__cnx中是初始化连接。这是回溯:
File "sdi/database/DbValidator.py", line 91, in process_records
self.__driver.insert_url(urldata)
File "/home/david/workspace/stickydi/sdi/database/MySQLDriver.py", line 87, in insert_url
cursor.executemany(query, data)
File "/usr/lib/python3/dist-packages/mysql/connector/cursor.py", line 492, in executemany
return self._batch_insert(operation,seq_params)
File "/usr/lib/python3/dist-packages/mysql/connector/cursor.py", line 428, in _batch_insert
fmt = m.group(1).encode(self._connection.charset)
AttributeError: 'NoneType' object has no attribute 'group'我有一个非常类似的方法,它工作正常,我只是不明白,为什么executemany( )会出错。
发布于 2013-08-18 18:17:12
您不应该对SQL参数使用%d。坚持%s并让MySQL连接器处理以下类型:
query = """\
INSERT INTO `sp_urls` (`parent_id`, `url`, `version`, `hits`)
VALUES (%s, %s, %s, %s)
ON DUPLICATE KEY UPDATE url=url
"""引用Python-MySQL文档的话
paramstyle字符串常量,说明接口所期望的参数标记格式的类型。设置为'format'= ANSI Cprintf格式代码,例如'...WHERE name=%s'。如果映射对象用于conn.execute(),则接口实际上使用'pyformat'= Python代码,例如'...WHERE name=%(name)s'。但是,API目前不允许在参数样式中指定多个样式。
当然,对%s参数的使用类似于Python格式,但并不相同。
发布于 2013-08-18 18:17:09
只使用%s作为query中的参数标记。不要使用%d
query = """
INSERT INTO `sp_urls` (`parent_id`, `url`, `version`, `hits`)
VALUES (%s, %s, %s, %s) ON DUPLICATE KEY UPDATE url=url""" %s是format DB中定义的参数样式。在字符串格式中,它与%s的含义不同。
要使用的正确参数样式取决于数据库驱动程序。MySQLdb使用%s。其他数据库驱动程序(如乌尔sql和sqlite3 )使用?。
https://stackoverflow.com/questions/18302175
复制相似问题