首页
学习
活动
专区
圈层
工具
发布

连接器/
EN

Stack Overflow用户
提问于 2013-08-18 18:05:11
回答 2查看 2.3K关注 0票数 1

在执行insert查询时,Connector/python有一个小问题。

我有将数据插入数据库的功能。参数数据是元组列表:[2652884,'http://www.example.com/','5.0.5.239',1),.]

代码语言:javascript
复制
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中是初始化连接。这是回溯:

代码语言:javascript
复制
  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( )会出错。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-08-18 18:17:12

您不应该对SQL参数使用%d。坚持%s并让MySQL连接器处理以下类型:

代码语言:javascript
复制
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 C printf格式代码,例如'...WHERE name=%s'。如果映射对象用于conn.execute(),则接口实际上使用'pyformat' = Python代码,例如'...WHERE name=%(name)s'。但是,API目前不允许在参数样式中指定多个样式。

当然,对%s参数的使用类似于Python格式,但并不相同。

票数 2
EN

Stack Overflow用户

发布于 2013-08-18 18:17:09

只使用%s作为query中的参数标记。不要使用%d

代码语言:javascript
复制
query = """
    INSERT INTO `sp_urls` (`parent_id`, `url`, `version`, `hits`) 
    VALUES (%s, %s, %s, %s) ON DUPLICATE KEY UPDATE url=url"""        

%sformat DB中定义的参数样式。在字符串格式中,它与%s的含义不同。

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18302175

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档