from sqlalchemy.dialects.postgresql import INTEGER, BIGINT
from ..autogenerate import render
from sqlalchemy import text, Numeric, Column
+from sqlalchemy.sql.expression import ColumnClause
from sqlalchemy.types import NULLTYPE
from sqlalchemy import types as sqltypes
args += [repr(render._ident(constraint.table.name))]
args.extend([
"(%s, %r)" % (
- render._render_potential_expr(
- sqltext, autogen_context, wrap_in_text=False),
+ _render_potential_column(sqltext, autogen_context),
opstring
)
for sqltext, name, opstring in constraint._render_exprs
else:
args = [
"(%s, %r)" % (
- render._render_potential_expr(
- sqltext, autogen_context, wrap_in_text=False),
+ _render_potential_column(sqltext, autogen_context),
opstring
) for sqltext, name, opstring in constraint._render_exprs
]
"prefix": _postgresql_autogenerate_prefix(autogen_context),
"args": ", ".join(args)
}
+
+
+def _render_potential_column(value, autogen_context):
+ if isinstance(value, ColumnClause):
+ template = "%(prefix)scolumn(%(name)r)"
+
+ return template % {
+ "prefix": render._sqlalchemy_autogenerate_prefix(autogen_context),
+ "name": value.name
+ }
+
+ else:
+ return render._render_potential_expr(value, autogen_context, wrap_in_text=False)
eq_ignore_whitespace(
autogenerate.render_op_text(autogen_context, op_obj),
- "op.create_exclude_constraint('t_excl_x', 't', ('x', '>'), "
+ "op.create_exclude_constraint('t_excl_x', 't', (sa.column('x'), '>'), "
"where=sa.text(!U'x != 2'), using='gist')"
)
+ @config.requirements.fail_before_sqla_100
+ def test_add_exclude_constraint_case_sensitive(self):
+ from sqlalchemy.dialects.postgresql import ExcludeConstraint
+
+ autogen_context = self.autogen_context
+
+ m = MetaData()
+ t = Table('TTAble', m,
+ Column('XColumn', String),
+ Column('YColumn', String)
+ )
+
+ op_obj = ops.AddConstraintOp.from_constraint(ExcludeConstraint(
+ (t.c.XColumn, ">"),
+ where=t.c.XColumn != 2,
+ using="gist",
+ name="t_excl_x"
+ ))
+
+ eq_ignore_whitespace(
+ autogenerate.render_op_text(autogen_context, op_obj),
+ "op.create_exclude_constraint('t_excl_x', 'TTAble', (sa.column('XColumn'), '>'), "
+ "where=sa.text(!U'\"XColumn\" != 2'), using='gist')"
+ )
+
+
@config.requirements.fail_before_sqla_100
def test_inline_exclude_constraint(self):
from sqlalchemy.dialects.postgresql import ExcludeConstraint
")"
)
+ @config.requirements.fail_before_sqla_100
+ def test_inline_exclude_constraint_case_sensitive(self):
+ from sqlalchemy.dialects.postgresql import ExcludeConstraint
+
+ autogen_context = self.autogen_context
+
+ m = MetaData()
+ t = Table(
+ 'TTable', m,
+ Column('XColumn', String),
+ Column('YColumn', String),
+ )
+ ExcludeConstraint(
+ (t.c.XColumn, ">"),
+ using="gist",
+ where='"XColumn" != 2',
+ name="TExclX"
+ )
+
+ op_obj = ops.CreateTableOp.from_table(t)
+
+ eq_ignore_whitespace(
+ autogenerate.render_op_text(autogen_context, op_obj),
+ "op.create_table('TTable',sa.Column('XColumn', sa.String(), "
+ "nullable=True),"
+ "sa.Column('YColumn', sa.String(), nullable=True),"
+ "postgresql.ExcludeConstraint((sa.column('XColumn'), '>'), "
+ "where=sa.text(!U'\"XColumn\" != 2'), using='gist', "
+ "name='TExclX'))"
+ )
+
@config.requirements.sqlalchemy_09
def test_json_type(self):
if config.requirements.sqlalchemy_110.enabled: