Python MySQLdb游标不支持空迭代器吗?
我有Python MySQLdb游标不支持空迭代器吗?,python,mysql,mysql-python,executemany,Python,Mysql,Mysql Python,Executemany,我有行作为空迭代器,它会触发一个错误 如果我使用cur.executemany(sql,list(rows)),那么它可以正常工作 cur.executemany(sql, rows) 下面是MySQLdb Cursors.py的代码 File "/Enthought/Canopy_64bit/User/lib/python2.7/site-packages/MySQLdb/cursors.py", line 252, in executemany r = self._query('
行
作为空迭代器,它会触发一个错误
如果我使用cur.executemany(sql,list(rows))
,那么它可以正常工作
cur.executemany(sql, rows)
下面是MySQLdb Cursors.py的代码
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不支持将空迭代器参数传递给
executemany
为什么不呢?由于行if not args:return
。这将处理这样的情况:通过完全切断服务器并返回None
来不提供任何参数。空列表、dict、set或tuple的真值为False
,但迭代器的真值始终为True
如果在cursors.py
中注释掉该行,则任何空序列或映射都将抛出与空迭代器相同的结果
为了使executemany
支持空参数,它必须测试args
是否为空。如果args
是迭代器,唯一的方法是调用.next()
并观察结果是否为StopIteration
异常;没有其他方法可以确定任意迭代器是否为空。这将是不切实际的,因为它使用迭代器中的一个项,不适用于任何非迭代器类型,并且毫无意义,因为executemany
首先不打算在没有参数的情况下使用
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