Connector / python executemany NoneType

时间:2013-08-18 18:05:12

标签: python mysql mysql-python

我在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()出错。

2 个答案:

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

%sformat paramstyle defined in the DB-API。它与字符串格式中的%s没有相同的含义。

使用正确的参数样式取决于数据库驱动程序。 MySQLdb使用%s。其他数据库驱动程序(例如oursqlsqlite3)使用?

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

引用Python-MySQL documentation

  

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

当然,对于SQL参数使用%s与Python字符串格式很容易相似,但它不一样。