2013-08-18 22 views
1

我有一个Connector/python执行插入查询的问题。连接器/ python executemany无类型

我有将数据插入数据库的功能。参数数据元组的列表: [(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() 

工作本身的查询,自.__ 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()出错。

回答

2

对于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 documentation引用:

paramstyle
字符串常量,说明参数标记格式化由接口期望的类型。设置为'format' = ANSI C printf格式代码,例如'...WHERE name=%s'。如果映射对象用于conn.execute(),那么接口实际上使用'pyformat' = Python扩展格式代码,例如, '...WHERE name=%(name)s'。但是,API目前不允许在paramstyle中指定多个样式。

当然,使用%s作为SQL参数与Python字符串格式化很相似,但并不相同。

+0

前段时间我非常简要地阅读了格式化约定,我只记得它是类C的约定,所以我认为它也适用于%d。我显然是错的,谢谢你的解释。 – dakov

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"""   

%sformatparamstyle defined in the DB-API。它与字符串格式中的%s的含义不同。

要使用的正确参数类型取决于数据库驱动程序。 MySQLdb使用%s。其他数据库驱动程序,如oursqlsqlite3使用?