1111#: Regular expression for :meth:`Cursor.executemany`.
1212#: executemany only suports simple bulk insert.
1313#: You can use it to load large dataset.
14- RE_INSERT_VALUES = re .compile (r"""INSERT\s.+\sVALUES\s+(\(\s*%s\s*(,\s*%s\s*)*\))\s*\Z""" ,
14+ RE_INSERT_VALUES = re .compile (r"""( INSERT\s.+\sVALUES\s+) (\(\s*%s\s*(?: ,\s*%s\s*)*\))( \s*(?:ON DUPLICATE.*)?) \Z""" ,
1515 re .IGNORECASE | re .DOTALL )
1616
1717
@@ -145,17 +145,18 @@ def executemany(self, query, args):
145145
146146 m = RE_INSERT_VALUES .match (query )
147147 if m :
148- q_values = m .group (1 ).rstrip ()
148+ q_prefix = m .group (1 )
149+ q_values = m .group (2 ).rstrip ()
150+ q_postfix = m .group (3 ) or ''
149151 assert q_values [0 ] == '(' and q_values [- 1 ] == ')'
150- q_prefix = query [:m .start (1 )]
151- return self ._do_execute_many (q_prefix , q_values , args ,
152+ return self ._do_execute_many (q_prefix , q_values , q_postfix , args ,
152153 self .max_stmt_length ,
153154 self ._get_db ().encoding )
154155
155156 self .rowcount = sum (self .execute (query , arg ) for arg in args )
156157 return self .rowcount
157158
158- def _do_execute_many (self , prefix , values , args , max_stmt_length , encoding ):
159+ def _do_execute_many (self , prefix , values , postfix , args , max_stmt_length , encoding ):
159160 conn = self ._get_db ()
160161 escape = self ._escape_args
161162 if isinstance (prefix , text_type ):
@@ -171,13 +172,13 @@ def _do_execute_many(self, prefix, values, args, max_stmt_length, encoding):
171172 v = values % escape (arg , conn )
172173 if isinstance (v , text_type ):
173174 v = v .encode (encoding )
174- if len (sql ) + len (v ) + 1 > max_stmt_length :
175- rows += self .execute (sql )
175+ if len (sql ) + len (v ) + len ( postfix ) + 1 > max_stmt_length :
176+ rows += self .execute (sql + postfix )
176177 sql = bytearray (prefix )
177178 else :
178179 sql += b','
179180 sql += v
180- rows += self .execute (sql )
181+ rows += self .execute (sql + postfix )
181182 self .rowcount = rows
182183 return rows
183184
0 commit comments