diff --git a/pymysql/cursors.py b/pymysql/cursors.py index 86475c00..baf0972e 100644 --- a/pymysql/cursors.py +++ b/pymysql/cursors.py @@ -12,7 +12,7 @@ #: executemany only suports simple bulk insert. #: You can use it to load large dataset. RE_INSERT_VALUES = re.compile( - r"\s*((?:INSERT|REPLACE)\s.+\sVALUES?\s+)" + + r"\s*((?:INSERT|REPLACE)\b.+\bVALUES?\s*)" + r"(\(\s*(?:%s|%\(.+\)s)\s*(?:,\s*(?:%s|%\(.+\)s)\s*)*\))" + r"(\s*(?:ON DUPLICATE.*)?);?\s*\Z", re.IGNORECASE | re.DOTALL) diff --git a/pymysql/tests/test_cursor.py b/pymysql/tests/test_cursor.py index 431ef4dd..add04755 100644 --- a/pymysql/tests/test_cursor.py +++ b/pymysql/tests/test_cursor.py @@ -79,6 +79,10 @@ def test_executemany(self): self.assertIsNotNone(m, 'error parse %(id_name)s') self.assertEqual(m.group(3), ' ON duplicate update', 'group 3 not ON duplicate update, bug in RE_INSERT_VALUES?') + # https://github.com/PyMySQL/PyMySQL/pull/597 + m = pymysql.cursors.RE_INSERT_VALUES.match("INSERT INTO bloup(foo, bar)VALUES(%s, %s)") + assert m is not None + # cursor._executed must bee "insert into test (data) values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9)" # list args data = range(10)