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