From 3dd5a8aef5ac6e467fde6c96b605bc6a2c1930c8 Mon Sep 17 00:00:00 2001 From: wu lei Date: Wed, 30 Aug 2017 21:29:05 +0800 Subject: [PATCH 1/2] allow no whitespaces between `VALUES` and `(` when do bulk insert/replace --- pymysql/cursors.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pymysql/cursors.py b/pymysql/cursors.py index 86475c00..89cbe1e7 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)\s.+\sVALUES?\s*)" + r"(\(\s*(?:%s|%\(.+\)s)\s*(?:,\s*(?:%s|%\(.+\)s)\s*)*\))" + r"(\s*(?:ON DUPLICATE.*)?);?\s*\Z", re.IGNORECASE | re.DOTALL) From 2638a6233821e341fb3604396113c779216fc941 Mon Sep 17 00:00:00 2001 From: wulei Date: Tue, 5 Sep 2017 18:46:50 +0800 Subject: [PATCH 2/2] fix regex pattern and add test case NOTE: copied from https://github.com/PyMySQL/mysqlclient-python/commit/354dcb59e286b0db3b108c92760d3ec135a8bc23 --- pymysql/cursors.py | 2 +- pymysql/tests/test_cursor.py | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/pymysql/cursors.py b/pymysql/cursors.py index 89cbe1e7..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)