diff options
author | Frazer McLean <frazer@frazermclean.co.uk> | 2016-06-13 10:31:18 -0400 |
---|---|---|
committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2016-06-13 10:31:18 -0400 |
commit | 84974cf09220105bc7a92e5bcde31f52827c1de7 (patch) | |
tree | 250677d68a0c6ba0070a97cd6cd3a7c2c2949c50 /lib/sqlalchemy/sql | |
parent | 7189d0bc82598c2d6dcbb55b054837416db2ee7d (diff) | |
download | sqlalchemy-pr_github_284.tar.gz |
Comment supportpr_github_284
Implementation of [#1546 (BitBucket)](https://bitbucket.org/zzzeek/sqlalchemy/issues/1546).
Very unfinished but I have reflection and setting after table creation working for PostgreSQL.
If you're not opposed, perhaps best to continue discussion on Gerrit?
Change-Id: Ib90683850805a2b4ee198e420dc294f32f15d35d
Pull-request: https://github.com/zzzeek/sqlalchemy/pull/284
Diffstat (limited to 'lib/sqlalchemy/sql')
-rw-r--r-- | lib/sqlalchemy/sql/compiler.py | 22 | ||||
-rw-r--r-- | lib/sqlalchemy/sql/ddl.py | 45 | ||||
-rw-r--r-- | lib/sqlalchemy/sql/schema.py | 5 |
3 files changed, 72 insertions, 0 deletions
diff --git a/lib/sqlalchemy/sql/compiler.py b/lib/sqlalchemy/sql/compiler.py index 6d9ab9039..b26b0d1a7 100644 --- a/lib/sqlalchemy/sql/compiler.py +++ b/lib/sqlalchemy/sql/compiler.py @@ -2396,6 +2396,28 @@ class DDLCompiler(Compiled): self.process(create.element) ) + def visit_set_table_comment(self, create): + return "COMMENT ON TABLE %s IS %s" % ( + self.preparer.format_table(create.element), + self.sql_compiler.render_literal_bindparam( + elements.BindParameter('comment', value=create.comment)) + ) + + def visit_drop_table_comment(self, drop): + return "COMMENT ON TABLE %s IS NULL" % \ + self.preparer.format_table(drop.element) + + def visit_set_column_comment(self, create): + return "COMMENT ON COLUMN %s IS %s" % ( + self.preparer.format_column(create.element, use_table=True), + self.sql_compiler.render_literal_bindparam( + elements.BindParameter('comment', value=create.comment)) + ) + + def visit_drop_column_comment(self, drop): + return "COMMENT ON COLUMN %s IS NULL" % \ + self.preparer.format_column(drop.element, use_table=True) + def visit_create_sequence(self, create): text = "CREATE SEQUENCE %s" % \ self.preparer.format_sequence(create.element) diff --git a/lib/sqlalchemy/sql/ddl.py b/lib/sqlalchemy/sql/ddl.py index 48f27b8b8..79fbc8ed6 100644 --- a/lib/sqlalchemy/sql/ddl.py +++ b/lib/sqlalchemy/sql/ddl.py @@ -486,6 +486,15 @@ class CreateTable(_CreateDropBase): ] self.include_foreign_key_constraints = include_foreign_key_constraints + if element.comment is not None: + event.listen(element, 'after_create', + SetTableComment(element, element.comment)) + + for col in element.columns: + if col.comment is not None: + event.listen(element, 'after_create', + SetColumnComment(col, col.comment)) + class _DropView(_CreateDropBase): """Semi-public 'DROP VIEW' construct. @@ -661,6 +670,42 @@ class DropConstraint(_CreateDropBase): self._create_rule_disable) +class SetTableComment(_CreateDropBase): + """Represent a COMMENT ON TABLE IS statement.""" + + __visit_name__ = "set_table_comment" + + def __init__(self, element, comment, **kw): + self.comment = comment + super(SetTableComment, self).__init__(element, **kw) + element._create_rule = util.portable_instancemethod( + self._create_rule_disable) + + +class DropTableComment(_CreateDropBase): + """Represent a COMMENT ON TABLE IS NULL statement.""" + + __visit_name__ = "drop_table_comment" + + +class SetColumnComment(_CreateDropBase): + """Represent a COMMENT ON COLUMN IS statement.""" + + __visit_name__ = "set_column_comment" + + def __init__(self, element, comment, **kw): + self.comment = comment + super(SetColumnComment, self).__init__(element, **kw) + element._create_rule = util.portable_instancemethod( + self._create_rule_disable) + + +class DropColumnComment(_CreateDropBase): + """Represent a COMMENT ON COLUMN IS NULL statement.""" + + __visit_name__ = "drop_column_comment" + + class DDLBase(SchemaVisitor): def __init__(self, connection): self.connection = connection diff --git a/lib/sqlalchemy/sql/schema.py b/lib/sqlalchemy/sql/schema.py index cb01a49e3..ede9c7944 100644 --- a/lib/sqlalchemy/sql/schema.py +++ b/lib/sqlalchemy/sql/schema.py @@ -490,6 +490,7 @@ class Table(DialectKWArgs, SchemaItem, TableClause): include_columns = kwargs.pop('include_columns', None) self.implicit_returning = kwargs.pop('implicit_returning', True) + self.comment = kwargs.pop('comment', None) if 'info' in kwargs: self.info = kwargs.pop('info') @@ -579,6 +580,9 @@ class Table(DialectKWArgs, SchemaItem, TableClause): if 'info' in kwargs: self.info = kwargs.pop('info') + if 'comment' in kwargs: + self.comment = kwargs.pop('comment') + if autoload: if not autoload_replace: exclude_columns = [c.name for c in self.c] @@ -1176,6 +1180,7 @@ class Column(SchemaItem, ColumnClause): self.autoincrement = kwargs.pop('autoincrement', "auto") self.constraints = set() self.foreign_keys = set() + self.comment = kwargs.pop('comment', None) # check if this Column is proxying another column if '_proxies' in kwargs: |