summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2015-05-18 20:21:49 -0400
committerMike Bayer <mike_mp@zzzcomputing.com>2015-05-18 20:21:49 -0400
commit29b301a7ec46b871dced5580293fa8f5f8d4e899 (patch)
tree5281336ba88b9338ab20eb53e69e91849345f9ce
parent87629c53ac53ffab4f76a4d5654828f183e00b23 (diff)
downloadalembic-29b301a7ec46b871dced5580293fa8f5f8d4e899.tar.gz
- Fixed bug where foreign key options including "onupdate",
"ondelete" would not render within the ``op.create_foreign_key()`` directive, even though they render within a full ``ForeignKeyConstraint`` directive. fixes #298
-rw-r--r--alembic/__init__.py2
-rw-r--r--alembic/autogenerate/render.py30
-rw-r--r--docs/build/changelog.rst12
-rw-r--r--tests/test_autogen_render.py75
4 files changed, 106 insertions, 13 deletions
diff --git a/alembic/__init__.py b/alembic/__init__.py
index 1e29b57..f429441 100644
--- a/alembic/__init__.py
+++ b/alembic/__init__.py
@@ -1,6 +1,6 @@
from os import path
-__version__ = '0.7.6'
+__version__ = '0.7.7'
package_dir = path.abspath(path.dirname(__file__))
diff --git a/alembic/autogenerate/render.py b/alembic/autogenerate/render.py
index 13830cf..5007652 100644
--- a/alembic/autogenerate/render.py
+++ b/alembic/autogenerate/render.py
@@ -263,10 +263,10 @@ def _add_fk_constraint(constraint, autogen_context):
"%s=%r" % ('referent_schema', target_schema)
)
- if constraint.deferrable:
- args.append("%s=%r" % ("deferrable", str(constraint.deferrable)))
- if constraint.initially:
- args.append("%s=%r" % ("initially", str(constraint.initially)))
+ opts = []
+ _populate_render_fk_opts(constraint, opts)
+ args.extend(("%s=%s" % (k, v) for (k, v) in opts))
+
return "%(prefix)screate_foreign_key(%(args)s)" % {
'prefix': _alembic_autogenerate_prefix(autogen_context),
'args': ", ".join(args)
@@ -562,15 +562,8 @@ def _fk_colspec(fk, metadata_schema):
return colspec
-def _render_foreign_key(constraint, autogen_context):
- rendered = _user_defined_render("foreign_key", constraint, autogen_context)
- if rendered is not False:
- return rendered
+def _populate_render_fk_opts(constraint, opts):
- opts = []
- if constraint.name:
- opts.append(("name", repr(
- _render_gen_name(autogen_context, constraint.name))))
if constraint.onupdate:
opts.append(("onupdate", repr(constraint.onupdate)))
if constraint.ondelete:
@@ -582,6 +575,19 @@ def _render_foreign_key(constraint, autogen_context):
if constraint.use_alter:
opts.append(("use_alter", repr(constraint.use_alter)))
+
+def _render_foreign_key(constraint, autogen_context):
+ rendered = _user_defined_render("foreign_key", constraint, autogen_context)
+ if rendered is not False:
+ return rendered
+
+ opts = []
+ if constraint.name:
+ opts.append(("name", repr(
+ _render_gen_name(autogen_context, constraint.name))))
+
+ _populate_render_fk_opts(constraint, opts)
+
apply_metadata_schema = constraint.parent.metadata.schema
return "%(prefix)sForeignKeyConstraint([%(cols)s], "\
"[%(refcols)s], %(args)s)" % {
diff --git a/docs/build/changelog.rst b/docs/build/changelog.rst
index 81c659d..e11713a 100644
--- a/docs/build/changelog.rst
+++ b/docs/build/changelog.rst
@@ -4,6 +4,18 @@ Changelog
==========
.. changelog::
+ :version: 0.7.7
+
+ .. change::
+ :tags: bug, autogenerate
+ :tickets: 298
+
+ Fixed bug where foreign key options including "onupdate",
+ "ondelete" would not render within the ``op.create_foreign_key()``
+ directive, even though they render within a full
+ ``ForeignKeyConstraint`` directive.
+
+.. changelog::
:version: 0.7.6
:released: May 5, 2015
diff --git a/tests/test_autogen_render.py b/tests/test_autogen_render.py
index 8d08f66..52f3601 100644
--- a/tests/test_autogen_render.py
+++ b/tests/test_autogen_render.py
@@ -269,6 +269,81 @@ unique=False, """
"op.create_foreign_key('fk_a_id', 'b', 'a', ['a_id'], ['id'])"
)
+ def test_add_fk_constraint_kwarg(self):
+ m = MetaData()
+ t1 = Table('t', m, Column('c', Integer))
+ t2 = Table('t2', m, Column('c_rem', Integer))
+
+ fk = ForeignKeyConstraint([t1.c.c], [t2.c.c_rem], onupdate="CASCADE")
+ if not util.sqla_08:
+ t1.append_constraint(fk)
+
+ # SQLA 0.9 generates a u'' here for remote cols while 0.8 does not,
+ # so just whack out "'u" here from the generated
+
+ eq_ignore_whitespace(
+ re.sub(
+ r"u'", "'",
+ autogenerate.render._add_fk_constraint(
+ fk, self.autogen_context)),
+ "op.create_foreign_key(None, 't', 't2', ['c'], ['c_rem'], "
+ "onupdate='CASCADE')"
+ )
+
+ fk = ForeignKeyConstraint([t1.c.c], [t2.c.c_rem], ondelete="CASCADE")
+ if not util.sqla_08:
+ t1.append_constraint(fk)
+
+ eq_ignore_whitespace(
+ re.sub(
+ r"u'", "'",
+ autogenerate.render._add_fk_constraint(
+ fk, self.autogen_context)),
+ "op.create_foreign_key(None, 't', 't2', ['c'], ['c_rem'], "
+ "ondelete='CASCADE')"
+ )
+
+ fk = ForeignKeyConstraint([t1.c.c], [t2.c.c_rem], deferrable=True)
+ if not util.sqla_08:
+ t1.append_constraint(fk)
+ eq_ignore_whitespace(
+ re.sub(
+ r"u'", "'",
+ autogenerate.render._add_fk_constraint(
+ fk, self.autogen_context),
+ ),
+ "op.create_foreign_key(None, 't', 't2', ['c'], ['c_rem'], "
+ "deferrable=True)"
+ )
+
+ fk = ForeignKeyConstraint([t1.c.c], [t2.c.c_rem], initially="XYZ")
+ if not util.sqla_08:
+ t1.append_constraint(fk)
+ eq_ignore_whitespace(
+ re.sub(
+ r"u'", "'",
+ autogenerate.render._add_fk_constraint(
+ fk, self.autogen_context)
+ ),
+ "op.create_foreign_key(None, 't', 't2', ['c'], ['c_rem'], "
+ "initially='XYZ')"
+ )
+
+ fk = ForeignKeyConstraint(
+ [t1.c.c], [t2.c.c_rem],
+ initially="XYZ", ondelete="CASCADE", deferrable=True)
+ if not util.sqla_08:
+ t1.append_constraint(fk)
+ eq_ignore_whitespace(
+ re.sub(
+ r"u'", "'",
+ autogenerate.render._add_fk_constraint(
+ fk, self.autogen_context)
+ ),
+ "op.create_foreign_key(None, 't', 't2', ['c'], ['c_rem'], "
+ "ondelete='CASCADE', initially='XYZ', deferrable=True)"
+ )
+
def test_add_fk_constraint_inline_colkeys(self):
m = MetaData()
Table('a', m, Column('id', Integer, key='aid', primary_key=True))