hafeng45 发表于 2021-7-20 23:41

关于数据库操作模块中cursor.executemany()函数返回值的问题

在python中使用数据库操作模块(例如pypyodbc)时候,都会有一个cursor.executemany()函数,可以一次性批量执行多条sql语句。
但是我看了下,该函数居然没有返回值。
那么问题来了,现在我的需求是要得到该函数运行后到底批量修改了多少条数据库记录,如何实现?求高手告知。

吾爱有三 发表于 2021-7-21 00:38

统计执行次数可行吗?

三木零 发表于 2021-7-21 09:30

executemany不是有一个统计了执行多少条语句的返回值吗

三木零 发表于 2021-7-21 09:32

但如果说要查看修改了多少条数据的话好像没什么有效的办法,或许是我还不知道
{:301_1008:}

as614001 发表于 2021-7-21 09:38

修改失败直接报错,只有成功和报错。
这个函数其实就是 executte()本质还是一条条执行。

hafeng45 发表于 2021-7-21 20:16

as614001 发表于 2021-7-21 09:38
修改失败直接报错,只有成功和报错。
这个函数其实就是 executte()本质还是一条条执行。

连续执行多条语句的时候,executemany()比execute()执行速度要快非常多。

但是,res = execute()能通过res.rowcount返回修改了多少条数据,而executemany()没有返回值,所以虽然它执行速度非常快,我却无法获取修改了多少条数据。

hafeng45 发表于 2021-7-21 20:17

三木零 发表于 2021-7-21 09:30
executemany不是有一个统计了执行多少条语句的返回值吗

execute有返回值,executemany没有

hafeng45 发表于 2021-7-21 20:22

吾爱有三 发表于 2021-7-21 00:38
统计执行次数可行吗?

统计执行次数可以通过参数列表的大小来做到,但问题是每次执行都有可能修改多条记录,所以光是统计执行次数无法得到修改了多少条记录。

其实批量用execute方法是可以统计出来总共修改了多少条数据库记录,只是考虑到executemany执行效率更高,所以不知道能不能通过executemany来实现

三木零 发表于 2021-7-21 21:16

hafeng45 发表于 2021-7-21 20:17
execute有返回值,executemany没有

    def executemany(self, query, args):
      # type: (str, list) -> int
      """Run several data against one query

      :param query: query to execute on server
      :param args:Sequence of sequences or mappings.It is used as parameter.
      :return: Number of rows affected, if any.

      This method improves performance on multiple-row INSERT and
      REPLACE. Otherwise it is equivalent to looping over args with
      execute().
      """
      if not args:
            return

      m = RE_INSERT_VALUES.match(query)
      if m:
            q_prefix = m.group(1) % ()
            q_values = m.group(2).rstrip()
            q_postfix = m.group(3) or ""
            assert q_values == "(" and q_values[-1] == ")"
            return self._do_execute_many(
                q_prefix,
                q_values,
                q_postfix,
                args,
                self.max_stmt_length,
                self._get_db().encoding,
            )

      self.rowcount = sum(self.execute(query, arg) for arg in args)
      return self.rowcount
这是源码,会返回一个统计了execute执行了多少条SQL语句的数量

hafeng45 发表于 2021-7-22 23:32

本帖最后由 hafeng45 于 2021-7-22 23:35 编辑

三木零 发表于 2021-7-21 21:16
    def executemany(self, query, args):
      # type: (str, list) -> int
...


    def executemany(self, query_string, params_list = ):
      if not self.connection:
            self.close()
            
      for params in params_list:
            self.execute(query_string, params, many_mode = True)
      self._NumOfRows()
      self.rowcount = -1
      self._UpdateDesc()
      #self._BindCols()



这是我从pypyodbc模块上拷的executemany源码,真的没有返回值。。。奇怪,你那个源码确实有返回值,那可能不同的模块实现不一样,对了,你那个是什么数据库模块中拷贝出来的源码?
页: [1] 2
查看完整版本: 关于数据库操作模块中cursor.executemany()函数返回值的问题