return []
- with EnvironmentContext(config, script, fn=display_version):
+ with EnvironmentContext(
+ config, script, fn=display_version, dont_mutate=True
+ ):
script.run_env()
else:
heads = self.get_current_heads()
- if not self.as_sql and not heads:
+ dont_mutate = self.opts.get("dont_mutate", False)
+
+ if not self.as_sql and not heads and not dont_mutate:
self._ensure_version_table()
head_maintainer = HeadMaintainer(self, heads)
--- /dev/null
+.. change::
+ :tags: bug, commands
+ :tickets: 694
+
+ The ``alembic current`` command no longer creates an ``alembic_version``
+ table in the database if one does not exist already, returning no version
+ as the current version. This allows checking for migrations in parallel
+ without introducing race conditions. Pull request courtesy Nikolay
+ Edigaryev.
+
from alembic.testing import assert_raises
from alembic.testing import assert_raises_message
from alembic.testing import eq_
+from alembic.testing import is_false
from alembic.testing import is_true
from alembic.testing import mock
from alembic.testing.env import _get_staging_directory
from alembic.testing.fixtures import capture_engine_context_buffer
from alembic.testing.fixtures import TestBase
from alembic.util import compat
+from alembic.util.sqla_compat import _connectable_has_table
class _BufMixin(object):
class CurrentTest(_BufMixin, TestBase):
@classmethod
def setup_class(cls):
+ cls.bind = _sqlite_file_db()
cls.env = env = staging_env()
cls.cfg = _sqlite_testing_config()
cls.a1 = env.generate_revision("a1", "a1")
eq_(lines, set(revs))
+ def test_doesnt_create_alembic_version(self):
+ command.current(self.cfg)
+ engine = self.bind
+ with engine.connect() as conn:
+ is_false(_connectable_has_table(conn, "alembic_version", None))
+
def test_no_current(self):
command.stamp(self.cfg, ())
with self._assert_lines([]):