python mysql使用executemany()出现TypeError

 mobiledu2502880517 发布于 2022-10-25 09:07
    def insertData(self,table,param):
        try:
            self.db.set_character_set('utf8')
            q= []
            for x in param:
                cols = ', '.join(x.keys())
                values = '"," '.join(x.values())
                q.append((table, cols, '"'+values+'"'))
            sql = "INSERT INTO %s(%s) VALUES(%s)"
            try:
                result = self.cur.executemany(sql,q)
                insert_id = self.db.insert_id()
                self.db.commit()
            except MySQLdb.Error,e:
                #发生错误时回滚
                self.db.rollback()
        except MySQLdb.Error,e:
            print self.getCurrentTime(),"数据库错误,原因%d: %s" % (e.args[0], e.args[1])

其中q的部分内容为[('houseurl', 'url', u'"/ershoufang/szlh11469938.html"'), ('houseurl', 'url', u'"/ershoufang/szlh11470634.html"')]

执行以上代码后,出现以下问题:

     29                         sql = "INSERT INTO %s(%s) VALUES(%s)"
     30                         try:
---> 31                                 result = self.cur.executemany(sql,q)
     32                                 insert_id = self.db.insert_id()
     33                                 self.db.commit()

/usr/lib/python2.7/dist-packages/MySQLdb/cursors.pyc in executemany(self, query, args)
    274                 self.errorhandler(self, ProgrammingError, msg.args[0])
    275             else:
--> 276                 self.errorhandler(self, TypeError, msg)
    277         except (SystemExit, KeyboardInterrupt):
    278             raise

/usr/lib/python2.7/dist-packages/MySQLdb/connections.pyc in defaulterrorhandler(***failed resolving arguments***)
     34     del connection
     35     if isinstance(errorvalue, BaseException):
---> 36         raise errorvalue
     37     if errorclass is not None:
     38         raise errorclass(errorvalue)

TypeError: not all arguments converted during string formatting

但是我一条条插入使用execute()就没问题。

1 个回答
  • "INSERT INTO %s(%s) VALUES(%s)"

    这种写法是错误的。占位符 %s 只能出现在值的地方,不能作为表名、字段名出现。.execute* 不会帮你处理这些东西。

    你可以预先构造好合适的 SQL 模板,再传给 .execute*。前提是,你的表名、字段名是确定不会有特殊字符的:

    fields = ...
    data = ...
    sql = 'INSERT INTO {}({}) VALUES(%s)'.format(table, fields)
    cur.executemany(sql, data)
    2022-10-26 14:40 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有