我在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()出错。
答案 0 :(得分:4)
仅在%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
paramstyle defined in the DB-API。它与字符串格式中的%s
没有相同的含义。
使用正确的参数样式取决于数据库驱动程序。 MySQLdb使用%s
。其他数据库驱动程序(例如oursql和sqlite3)使用?
。
答案 1 :(得分:2)
您应该不使用%d
来获取SQL参数。坚持%s
并让MySQL连接器处理类型:
query = """\
INSERT INTO `sp_urls` (`parent_id`, `url`, `version`, `hits`)
VALUES (%s, %s, %s, %s)
ON DUPLICATE KEY UPDATE url=url
"""
paramstyle
字符串常量,说明接口所需的参数标记格式的类型。设置为'format'
= ANSI Cprintf
格式代码,例如'...WHERE name=%s'
。如果映射对象用于conn.execute(),则接口实际使用'pyformat'
= Python扩展格式代码,例如'...WHERE name=%(name)s'
。但是,API目前不允许在paramstyle中指定多个样式。
当然,对于SQL参数使用%s
与Python字符串格式很容易相似,但它不一样。