summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--migrate/tests/versioning/test_script.py2
-rw-r--r--migrate/versioning/script/sql.py21
-rw-r--r--requirements.txt1
-rw-r--r--test-requirements.txt2
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