0
cur.executemany(sql, rows)

rows空のイテレータを使用すると、エラーが発生します。

もしそうならcur.executemany(sql, list(rows))、それはうまくいきます。

 File "/Enthought/Canopy_64bit/User/lib/python2.7/site-packages/MySQLdb/cursors.py", line 252, in executemany
    r = self._query('\n'.join([query[:p], ',\n'.join(q), query[e:]]))
  File "/Enthought/Canopy_64bit/User/lib/python2.7/site-packages/MySQLdb/cursors.py", line 344, in _query
    rowcount = self._do_query(q)
  File "/Enthought/Canopy_64bit/User/lib/python2.7/site-packages/MySQLdb/cursors.py", line 308, in _do_query
    db.query(q)
_mysql_exceptions.ProgrammingError: (1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1")

以下は、MySQLdb Cursors.py

    def executemany(self, query, args):

        """Execute a multi-row query.

        query -- string, query to execute on server

        args

            Sequence of sequences or mappings, parameters to use with
            query.

        Returns long integer rows affected, if any.

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

        """
        del self.messages[:]
        db = self._get_db()
        if not args: return
        if isinstance(query, unicode):
            query = query.encode(db.unicode_literal.charset)
        m = insert_values.search(query)
        if not m:
            r = 0
            for a in args:
                r = r + self.execute(query, a)
            return r
        p = m.start(1)
        e = m.end(1)
        qv = m.group(1)
        try:
            q = [ qv % db.literal(a) for a in args ]
        except TypeError, msg:
            if msg.args[0] in ("not enough arguments for format string",
                               "not all arguments converted"):
                self.errorhandler(self, ProgrammingError, msg.args[0])
            else:
                self.errorhandler(self, TypeError, msg)
        except (SystemExit, KeyboardInterrupt):
            raise
        except:
            exc, value, tb = sys.exc_info()
            del tb
            self.errorhandler(self, exc, value)
        r = self._query('\n'.join([query[:p], ',\n'.join(q), query[e:]]))
        if not self._defer_warnings: self._warning_check()
        return r
4

1 に答える 1

1

簡単な答えは次のとおりです。いいえ、MySQLdb は空のイテレータ引数を に渡すことをサポートしていませんexecutemany

なぜだめですか?ラインのためif not args: return。これは、サーバーを完全に切り取って返すことにより、パラメーターを提供しない場合を処理しますNone。空のリスト、dict、set、または tupleFalseの真偽値は ですが、反復子の真偽値は常にTrueです。

でその行をコメントアウトするとcursors.py、空のシーケンスまたはマッピングはER_PARSE_ERROR空のイテレータと同じものをスローします。

executemanyが空の引数をサポートするためには、argsが空かどうかをテストする必要があります。が反復子の場合args、これを行う唯一の方法は、呼び出して、結果が例外.next()かどうかを観察することです。StopIteration任意の反復子が空かどうかを判断する方法は他にありません。これは、イテレータからアイテムを消費し、イテレータ以外の型では機能しないため実用的ではありませんexecutemany。また、そもそもパラメータなしで使用することを意図していないため、無意味です。

于 2014-05-19T20:52:50.767 に答える