summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--migrate/tests/versioning/test_script.py2
-rw-r--r--migrate/versioning/script/sql.py18
-rw-r--r--requirements.txt1
3 files changed, 12 insertions, 9 deletions
diff --git a/migrate/tests/versioning/test_script.py b/migrate/tests/versioning/test_script.py
index 183eb7e..c26b03b 100644
--- a/migrate/tests/versioning/test_script.py
+++ b/migrate/tests/versioning/test_script.py
@@ -269,5 +269,5 @@ class TestSqlScript(fixture.Pathed, fixture.DB):
# run the change
sqls = SqlScript(src)
- sqls.run(self.engine, executemany=False)
+ sqls.run(self.engine)
tmp_sql_table.metadata.drop_all(self.engine, checkfirst=True)
diff --git a/migrate/versioning/script/sql.py b/migrate/versioning/script/sql.py
index 40d628f..70b49ec 100644
--- a/migrate/versioning/script/sql.py
+++ b/migrate/versioning/script/sql.py
@@ -3,6 +3,8 @@
import logging
import shutil
+import sqlparse
+
from migrate.versioning.script import base
from migrate.versioning.template import Template
@@ -24,7 +26,7 @@ class SqlScript(base.BaseScript):
return cls(path)
# TODO: why is step parameter even here?
- def run(self, engine, step=None, executemany=True):
+ def run(self, engine, step=None):
"""Runs SQL script through raw dbapi execute call"""
text = self.source()
# Don't rely on SA's autocommit here
@@ -34,13 +36,13 @@ class SqlScript(base.BaseScript):
try:
trans = conn.begin()
try:
- # HACK: SQLite doesn't allow multiple statements through
- # its execute() method, but it provides executescript() instead
- dbapi = conn.engine.raw_connection()
- if executemany and getattr(dbapi, 'executescript', None):
- dbapi.executescript(text)
- else:
- conn.execute(text)
+ # NOTE(ihrachys): script may contain multiple statements, and
+ # not all drivers reliably handle multistatement queries or
+ # commands passed to .execute(), so split them and execute one
+ # by one
+ for statement in sqlparse.split(text):
+ if statement:
+ conn.execute(statement)
trans.commit()
except Exception as e:
log.error("SQL script %s failed: %s", self.path, e)
diff --git a/requirements.txt b/requirements.txt
index 17a1932..a3c1d8a 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -6,4 +6,5 @@ pbr>=0.5.21,<1.0
SQLAlchemy>=0.7.8
decorator
six>=1.4.1
+sqlparse
Tempita >= 0.4