from sqlalchemy import schema as sa_schema
from sqlalchemy import sql
from sqlalchemy import types as sqltypes
+from sqlalchemy.sql.base import _DialectArgView
from sqlalchemy.sql.elements import conv
from sqlalchemy.sql.elements import Label
from sqlalchemy.sql.elements import quoted_name
return buf.getvalue()
+def _render_dialect_kwargs_items(
+ autogen_context: AutogenContext, dialect_kwargs: _DialectArgView
+) -> list[str]:
+ return [
+ f"{key}={_render_potential_expr(val, autogen_context)}"
+ for key, val in dialect_kwargs.items()
+ ]
+
+
def render_op(
autogen_context: AutogenContext, op: ops.MigrateOperation
) -> List[str]:
return text
-def _render_dialect_kwargs_items(
- autogen_context: AutogenContext, item: DialectKWArgs
-) -> list[str]:
- return [
- f"{key}={_render_potential_expr(val, autogen_context)}"
- for key, val in item.dialect_kwargs.items()
- ]
-
-
@renderers.dispatch_for(ops.CreateIndexOp)
def _add_index(autogen_context: AutogenContext, op: ops.CreateIndexOp) -> str:
index = op.to_index()
assert index.table is not None
- opts = _render_dialect_kwargs_items(autogen_context, index)
+ opts = _render_dialect_kwargs_items(autogen_context, index.dialect_kwargs)
if op.if_not_exists is not None:
opts.append("if_not_exists=%r" % bool(op.if_not_exists))
text = tmpl % {
"%(prefix)sdrop_index(%(name)r, "
"table_name=%(table_name)r%(schema)s%(kwargs)s)"
)
- opts = _render_dialect_kwargs_items(autogen_context, index)
+ opts = _render_dialect_kwargs_items(autogen_context, index.dialect_kwargs)
if op.if_exists is not None:
opts.append("if_exists=%r" % bool(op.if_exists))
text = tmpl % {
if value is not None:
args.append("%s=%r" % (k, value))
- return "%(prefix)screate_foreign_key(%(args)s)" % {
+
+ # op.to_constraint() may fail with `multiple values for argument 'name'`.
+ dialect_kwarg_view = getattr(op.kw, "dialect_kwargs", {})
+ dialect_kwargs = _render_dialect_kwargs_items(autogen_context, dialect_kwarg_view)
+
+ return "%(prefix)screate_foreign_key(%(args)s%(dialect_kwargs)s)" % {
"prefix": _alembic_autogenerate_prefix(autogen_context),
"args": ", ".join(args),
+ "dialect_kwargs": ", " + ", ".join(dialect_kwargs) if dialect_kwargs else "",
}
opts.append(
("name", _render_gen_name(autogen_context, constraint.name))
)
- dialect_options = _render_dialect_kwargs_items(autogen_context, constraint)
+ dialect_options = _render_dialect_kwargs_items(autogen_context, constraint.dialect_kwargs)
if alter:
args = [repr(_render_gen_name(autogen_context, constraint.name))]
op.create_index("i", "t", ["c1", "c2"], if_not_exists=True)
context.assert_("CREATE INDEX IF NOT EXISTS i ON t (c1, c2)")
+ def test_create_fk_postgresql_not_valid(self):
+ context = op_fixture("postgresql")
+ op.create_foreign_key("i", "t1", "t2", ["c1"], ["c2"], postgresql_not_valid=True)
+ context.assert_("ALTER TABLE t1 ADD CONSTRAINT i FOREIGN KEY(c1) REFERENCES t2 (c2) NOT VALID")
+
@config.combinations("include_table", "no_table", argnames="include_table")
def test_drop_index_postgresql_concurrently(self, include_table):
context = op_fixture("postgresql")