| Viewing file:  base.py (5.79 KB)      -rw-r--r-- Select action/file-type:
 
  (+) |  (+) |  (+) | Code (+) | Session (+) |  (+) | SDB (+) |  (+) |  (+) |  (+) |  (+) |  (+) | 
 
import functools
 from sqlalchemy.ext.compiler import compiles
 from sqlalchemy.schema import DDLElement, Column
 from sqlalchemy import Integer
 from sqlalchemy import types as sqltypes
 from .. import util
 
 # backwards compat
 from ..util.sqla_compat import (  # noqa
 _table_for_constraint,
 _columns_for_constraint, _fk_spec, _is_type_bound, _find_columns)
 
 if util.sqla_09:
 from sqlalchemy.sql.elements import quoted_name
 
 
 class AlterTable(DDLElement):
 
 """Represent an ALTER TABLE statement.
 
 Only the string name and optional schema name of the table
 is required, not a full Table object.
 
 """
 
 def __init__(self, table_name, schema=None):
 self.table_name = table_name
 self.schema = schema
 
 
 class RenameTable(AlterTable):
 
 def __init__(self, old_table_name, new_table_name, schema=None):
 super(RenameTable, self).__init__(old_table_name, schema=schema)
 self.new_table_name = new_table_name
 
 
 class AlterColumn(AlterTable):
 
 def __init__(self, name, column_name, schema=None,
 existing_type=None,
 existing_nullable=None,
 existing_server_default=None):
 super(AlterColumn, self).__init__(name, schema=schema)
 self.column_name = column_name
 self.existing_type = sqltypes.to_instance(existing_type) \
 if existing_type is not None else None
 self.existing_nullable = existing_nullable
 self.existing_server_default = existing_server_default
 
 
 class ColumnNullable(AlterColumn):
 
 def __init__(self, name, column_name, nullable, **kw):
 super(ColumnNullable, self).__init__(name, column_name,
 **kw)
 self.nullable = nullable
 
 
 class ColumnType(AlterColumn):
 
 def __init__(self, name, column_name, type_, **kw):
 super(ColumnType, self).__init__(name, column_name,
 **kw)
 self.type_ = sqltypes.to_instance(type_)
 
 
 class ColumnName(AlterColumn):
 
 def __init__(self, name, column_name, newname, **kw):
 super(ColumnName, self).__init__(name, column_name, **kw)
 self.newname = newname
 
 
 class ColumnDefault(AlterColumn):
 
 def __init__(self, name, column_name, default, **kw):
 super(ColumnDefault, self).__init__(name, column_name, **kw)
 self.default = default
 
 
 class AddColumn(AlterTable):
 
 def __init__(self, name, column, schema=None):
 super(AddColumn, self).__init__(name, schema=schema)
 self.column = column
 
 
 class DropColumn(AlterTable):
 
 def __init__(self, name, column, schema=None):
 super(DropColumn, self).__init__(name, schema=schema)
 self.column = column
 
 
 @compiles(RenameTable)
 def visit_rename_table(element, compiler, **kw):
 return "%s RENAME TO %s" % (
 alter_table(compiler, element.table_name, element.schema),
 format_table_name(compiler, element.new_table_name, element.schema)
 )
 
 
 @compiles(AddColumn)
 def visit_add_column(element, compiler, **kw):
 return "%s %s" % (
 alter_table(compiler, element.table_name, element.schema),
 add_column(compiler, element.column, **kw)
 )
 
 
 @compiles(DropColumn)
 def visit_drop_column(element, compiler, **kw):
 return "%s %s" % (
 alter_table(compiler, element.table_name, element.schema),
 drop_column(compiler, element.column.name, **kw)
 )
 
 
 @compiles(ColumnNullable)
 def visit_column_nullable(element, compiler, **kw):
 return "%s %s %s" % (
 alter_table(compiler, element.table_name, element.schema),
 alter_column(compiler, element.column_name),
 "DROP NOT NULL" if element.nullable else "SET NOT NULL"
 )
 
 
 @compiles(ColumnType)
 def visit_column_type(element, compiler, **kw):
 return "%s %s %s" % (
 alter_table(compiler, element.table_name, element.schema),
 alter_column(compiler, element.column_name),
 "TYPE %s" % format_type(compiler, element.type_)
 )
 
 
 @compiles(ColumnName)
 def visit_column_name(element, compiler, **kw):
 return "%s RENAME %s TO %s" % (
 alter_table(compiler, element.table_name, element.schema),
 format_column_name(compiler, element.column_name),
 format_column_name(compiler, element.newname)
 )
 
 
 @compiles(ColumnDefault)
 def visit_column_default(element, compiler, **kw):
 return "%s %s %s" % (
 alter_table(compiler, element.table_name, element.schema),
 alter_column(compiler, element.column_name),
 "SET DEFAULT %s" %
 format_server_default(compiler, element.default)
 if element.default is not None
 else "DROP DEFAULT"
 )
 
 
 def quote_dotted(name, quote):
 """quote the elements of a dotted name"""
 
 if util.sqla_09 and isinstance(name, quoted_name):
 return quote(name)
 result = '.'.join([quote(x) for x in name.split('.')])
 return result
 
 
 def format_table_name(compiler, name, schema):
 quote = functools.partial(compiler.preparer.quote, force=None)
 if schema:
 return quote_dotted(schema, quote) + "." + quote(name)
 else:
 return quote(name)
 
 
 def format_column_name(compiler, name):
 return compiler.preparer.quote(name, None)
 
 
 def format_server_default(compiler, default):
 return compiler.get_column_default_string(
 Column("x", Integer, server_default=default)
 )
 
 
 def format_type(compiler, type_):
 return compiler.dialect.type_compiler.process(type_)
 
 
 def alter_table(compiler, name, schema):
 return "ALTER TABLE %s" % format_table_name(compiler, name, schema)
 
 
 def drop_column(compiler, name):
 return 'DROP COLUMN %s' % format_column_name(compiler, name)
 
 
 def alter_column(compiler, name):
 return 'ALTER COLUMN %s' % format_column_name(compiler, name)
 
 
 def add_column(compiler, column, **kw):
 return "ADD COLUMN %s" % compiler.get_column_specification(column, **kw)
 
 |