diff options
-rw-r--r-- | migrate/tests/versioning/test_script.py | 2 | ||||
-rw-r--r-- | migrate/versioning/script/sql.py | 21 | ||||
-rw-r--r-- | requirements.txt | 1 | ||||
-rw-r--r-- | test-requirements.txt | 2 |
4 files changed, 15 insertions, 11 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 fdc9e2b..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,15 +36,16 @@ 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: + except Exception as e: + log.error("SQL script %s failed: %s", self.path, e) trans.rollback() raise finally: 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 diff --git a/test-requirements.txt b/test-requirements.txt index c22f516..3a10a63 100644 --- a/test-requirements.txt +++ b/test-requirements.txt @@ -15,7 +15,7 @@ python-subunit>=0.0.18 sphinx>=1.1.2,<1.2 sphinxcontrib_issuetracker testrepository>=0.0.17 -testtools>=0.9.34 +testtools>=0.9.34,<0.9.36 scripttest # NOTE(rpodolyaka): This version identifier is currently necessary as |