summaryrefslogtreecommitdiff
path: root/migrate/versioning/script
diff options
context:
space:
mode:
authoriElectric <unknown>2009-08-10 12:24:01 +0200
committeriElectric <unknown>2009-08-10 12:24:01 +0200
commitccf7be33721e4584206cde292b07479aa6b47f1d (patch)
treea9889e43157ca4cf9fab26a085747d9b99b43620 /migrate/versioning/script
parente529a662500e9c4d7d55d80c887a8b2437d838cb (diff)
parenta186d2edf204ca0f048747436a92ac8c57120c14 (diff)
downloadsqlalchemy-migrate-ccf7be33721e4584206cde292b07479aa6b47f1d.tar.gz
merge
Diffstat (limited to 'migrate/versioning/script')
-rw-r--r--migrate/versioning/script/base.py3
-rw-r--r--migrate/versioning/script/py.py29
-rw-r--r--migrate/versioning/script/sql.py20
3 files changed, 34 insertions, 18 deletions
diff --git a/migrate/versioning/script/base.py b/migrate/versioning/script/base.py
index 1c6cca9..0a9d1b7 100644
--- a/migrate/versioning/script/base.py
+++ b/migrate/versioning/script/base.py
@@ -1,13 +1,12 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
-
import logging
from migrate.versioning.config import operations
from migrate.versioning import pathed, exceptions
-log = logging.getLogger(__name__)
+log = logging.getLogger(__name__)
class BaseScript(pathed.Pathed):
"""Base class for other types of scripts.
diff --git a/migrate/versioning/script/py.py b/migrate/versioning/script/py.py
index 9f5d514..74d4903 100644
--- a/migrate/versioning/script/py.py
+++ b/migrate/versioning/script/py.py
@@ -2,6 +2,8 @@
# -*- coding: utf-8 -*-
import shutil
+import warnings
+import logging
from StringIO import StringIO
import migrate
@@ -12,6 +14,9 @@ from migrate.versioning.script import base
from migrate.versioning.util import import_path, load_model, construct_engine
+log = logging.getLogger(__name__)
+__all__ = ['PythonScript']
+
class PythonScript(base.BaseScript):
"""Base for Python scripts"""
@@ -83,16 +88,11 @@ class PythonScript(base.BaseScript):
:param path: Script location
:type path: string
-
:raises: :exc:`InvalidScriptError <migrate.versioning.exceptions.InvalidScriptError>`
:returns: Python module
"""
# Try to import and get the upgrade() func
- try:
- module = import_path(path)
- except:
- # If the script itself has errors, that's not our problem
- raise
+ module = import_path(path)
try:
assert callable(module.upgrade)
except Exception, e:
@@ -129,13 +129,15 @@ class PythonScript(base.BaseScript):
op = 'downgrade'
else:
raise exceptions.ScriptError("%d is not a valid step" % step)
+
funcname = base.operations[op]
-
- func = self._func(funcname)
+ script_func = self._func(funcname)
+
try:
- func(engine)
+ script_func(engine)
except TypeError:
- print "upgrade/downgrade functions must accept engine parameter (since ver 0.5.5)"
+ warnings.warn("upgrade/downgrade functions must accept engine"
+ " parameter (since version > 0.5.4)")
raise
@property
@@ -148,8 +150,7 @@ class PythonScript(base.BaseScript):
return self._module
def _func(self, funcname):
- try:
- return getattr(self.module, funcname)
- except AttributeError:
- msg = "The function %s is not defined in this script"
+ if not hasattr(self.module, funcname):
+ msg = "Function '%s' is not defined in this script"
raise exceptions.ScriptError(msg % funcname)
+ return getattr(self.module, funcname)
diff --git a/migrate/versioning/script/sql.py b/migrate/versioning/script/sql.py
index 851fdf2..ed80764 100644
--- a/migrate/versioning/script/sql.py
+++ b/migrate/versioning/script/sql.py
@@ -1,14 +1,30 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
+import logging
+import shutil
from migrate.versioning.script import base
+from migrate.versioning.template import Template
+log = logging.getLogger(__name__)
+
class SqlScript(base.BaseScript):
"""A file containing plain SQL statements."""
+ @classmethod
+ def create(cls, path, **opts):
+ """Create an empty migration script at specified path
+
+ :returns: :class:`SqlScript instance <migrate.versioning.script.sql.SqlScript>`"""
+ cls.require_notfound(path)
+
+ src = Template(opts.pop('templates_path', None)).get_sql_script(theme=opts.pop('templates_theme', None))
+ shutil.copy(src, path)
+ return cls(path)
+
# TODO: why is step parameter even here?
- def run(self, engine, step=None):
+ def run(self, engine, step=None, executemany=True):
"""Runs SQL script through raw dbapi execute call"""
text = self.source()
# Don't rely on SA's autocommit here
@@ -21,7 +37,7 @@ class SqlScript(base.BaseScript):
# HACK: SQLite doesn't allow multiple statements through
# its execute() method, but it provides executescript() instead
dbapi = conn.engine.raw_connection()
- if getattr(dbapi, 'executescript', None):
+ if executemany and getattr(dbapi, 'executescript', None):
dbapi.executescript(text)
else:
conn.execute(text)