summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2014-03-14 16:41:21 -0400
committerMike Bayer <mike_mp@zzzcomputing.com>2014-03-14 16:41:21 -0400
commitce7ce28f3c11774c61668663fe60ff41080de90a (patch)
tree7e010a9e8262d400d4456ca4978ffa089fc206a3
parent623c7e76ef04c5656d7a116287a39e318f6744b1 (diff)
downloadalembic-ce7ce28f3c11774c61668663fe60ff41080de90a.tar.gz
- Added support for the ``initially``, ``match`` keyword arguments
as well as dialect-specific keyword arguments to :meth:`.Operations.create_foreign_key`. fixes #190
-rw-r--r--alembic/operations.py17
-rw-r--r--docs/build/changelog.rst7
-rw-r--r--tests/test_op.py35
3 files changed, 53 insertions, 6 deletions
diff --git a/alembic/operations.py b/alembic/operations.py
index 828b420..f1d06a5 100644
--- a/alembic/operations.py
+++ b/alembic/operations.py
@@ -73,7 +73,8 @@ class Operations(object):
local_cols, remote_cols,
onupdate=None, ondelete=None,
deferrable=None, source_schema=None,
- referent_schema=None):
+ referent_schema=None, initially=None,
+ match=None, **dialect_kw):
m = self._metadata()
if source == referent:
t1_cols = local_cols + remote_cols
@@ -95,7 +96,10 @@ class Operations(object):
name=name,
onupdate=onupdate,
ondelete=ondelete,
- deferrable=deferrable
+ deferrable=deferrable,
+ initially=initially,
+ match=match,
+ **dialect_kw
)
t1.append_constraint(f)
@@ -514,10 +518,12 @@ class Operations(object):
schema)
)
+
def create_foreign_key(self, name, source, referent, local_cols,
remote_cols, onupdate=None, ondelete=None,
- deferrable=None, source_schema=None,
- referent_schema=None):
+ deferrable=None, initially=None, match=None,
+ source_schema=None, referent_schema=None,
+ **dialect_kw):
"""Issue a "create foreign key" instruction using the
current migration context.
@@ -567,7 +573,8 @@ class Operations(object):
local_cols, remote_cols,
onupdate=onupdate, ondelete=ondelete,
deferrable=deferrable, source_schema=source_schema,
- referent_schema=referent_schema)
+ referent_schema=referent_schema,
+ initially=initially, match=match, **dialect_kw)
)
def create_unique_constraint(self, name, source, local_cols,
diff --git a/docs/build/changelog.rst b/docs/build/changelog.rst
index 0b142df..8fae97e 100644
--- a/docs/build/changelog.rst
+++ b/docs/build/changelog.rst
@@ -6,6 +6,13 @@ Changelog
:version: 0.6.4
.. change::
+ :tags: bug
+ :tickets: 190
+
+ Added support for the ``initially``, ``match`` keyword arguments
+ as well as dialect-specific keyword arguments to
+ :meth:`.Operations.create_foreign_key`.
+
:tags: feature
:tickets: 163
diff --git a/tests/test_op.py b/tests/test_op.py
index a243aeb..1b82af3 100644
--- a/tests/test_op.py
+++ b/tests/test_op.py
@@ -6,7 +6,8 @@ from sqlalchemy.sql import column, func, text
from sqlalchemy import event
from alembic import op
-from . import op_fixture, assert_raises_message, requires_094
+from . import op_fixture, assert_raises_message, requires_094, eq_
+import mock
@event.listens_for(Table, "after_parent_attach")
def _add_cols(table, metadata):
@@ -397,6 +398,38 @@ def test_add_foreign_key_deferrable():
"REFERENCES t2 (bat, hoho) DEFERRABLE"
)
+def test_add_foreign_key_initially():
+ context = op_fixture()
+ op.create_foreign_key('fk_test', 't1', 't2',
+ ['foo', 'bar'], ['bat', 'hoho'],
+ initially='INITIAL')
+ context.assert_(
+ "ALTER TABLE t1 ADD CONSTRAINT fk_test FOREIGN KEY(foo, bar) "
+ "REFERENCES t2 (bat, hoho) INITIALLY INITIAL"
+ )
+
+def test_add_foreign_key_match():
+ context = op_fixture()
+ op.create_foreign_key('fk_test', 't1', 't2',
+ ['foo', 'bar'], ['bat', 'hoho'],
+ match='SIMPLE')
+ context.assert_(
+ "ALTER TABLE t1 ADD CONSTRAINT fk_test FOREIGN KEY(foo, bar) "
+ "REFERENCES t2 (bat, hoho) MATCH SIMPLE"
+ )
+
+def test_add_foreign_key_dialect_kw():
+ context = op_fixture()
+ with mock.patch("alembic.operations.sa_schema.ForeignKeyConstraint") as fkc:
+ op.create_foreign_key('fk_test', 't1', 't2',
+ ['foo', 'bar'], ['bat', 'hoho'],
+ foobar_arg='xyz')
+ eq_(fkc.mock_calls[0],
+ mock.call(['foo', 'bar'], ['t2.bat', 't2.hoho'],
+ onupdate=None, ondelete=None, name='fk_test',
+ foobar_arg='xyz',
+ deferrable=None, initially=None, match=None))
+
def test_add_foreign_key_self_referential():
context = op_fixture()
op.create_foreign_key("fk_test", "t1", "t1", ["foo"], ["bar"])