root/galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/changeset/databases/mysql.py @ 3

リビジョン 3, 3.4 KB (コミッタ: kohda, 14 年 前)

Install Unix tools  http://hannonlab.cshl.edu/galaxy_unix_tools/galaxy.html

行番号 
1"""
2   MySQL database specific implementations of changeset classes.
3"""
4
5from migrate.changeset import ansisql, exceptions
6from sqlalchemy.databases import mysql as sa_base
7#import sqlalchemy as sa
8
9MySQLSchemaGenerator = sa_base.MySQLSchemaGenerator
10
11
12class MySQLColumnGenerator(MySQLSchemaGenerator, ansisql.ANSIColumnGenerator):
13
14    def _do_quote_table_identifier(self, identifier):
15        return '%s'%identifier
16    pass
17
18
19class MySQLColumnDropper(ansisql.ANSIColumnDropper):
20
21    def _do_quote_table_identifier(self, identifier):
22        return '%s'%identifier
23
24    def _do_quote_column_identifier(self, identifier):
25        return '%s'%identifier
26
27
28class MySQLSchemaChanger(MySQLSchemaGenerator, ansisql.ANSISchemaChanger):
29
30    def visit_column(self, delta):
31        keys = delta.keys()
32        if 'type' in keys or 'nullable' in keys or 'name' in keys:
33            self._run_subvisit(delta, self._visit_column_change)
34        if 'server_default' in keys:
35            # Column name might have changed above
36            col_name = delta.get('name', delta.current_name)
37            self._run_subvisit(delta, self._visit_column_default,
38                               col_name=col_name)
39
40    def _visit_column_change(self, table_name, col_name, delta):
41        if not hasattr(delta, 'result_column'):
42            # Mysql needs the whole column definition, not just a lone
43            # name/type
44            raise exceptions.NotSupportedError(
45                "A column object is required to do this")
46
47        column = delta.result_column
48        # needed by get_column_specification
49        if not column.table:
50            column.table = delta.table
51        colspec = self.get_column_specification(column)
52        self.start_alter_table(table_name)
53        self.append("CHANGE COLUMN ")
54        self.append(col_name)
55        self.append(' ')
56        self.append(colspec)
57
58    def visit_index(self, param):
59        # If MySQL can do this, I can't find how
60        raise exceptions.NotSupportedError("MySQL cannot rename indexes")
61
62    def _do_quote_table_identifier(self, identifier):
63        return '%s'%identifier
64
65
66class MySQLConstraintGenerator(ansisql.ANSIConstraintGenerator):
67
68    def _do_quote_table_identifier(self, identifier):
69        return '%s'%identifier
70
71
72class MySQLConstraintDropper(ansisql.ANSIConstraintDropper):
73    #def visit_constraint(self,constraint):
74    #    if isinstance(constraint,sqlalchemy.schema.PrimaryKeyConstraint):
75    #        return self._visit_constraint_pk(constraint)
76    #    elif isinstance(constraint,sqlalchemy.schema.ForeignKeyConstraint):
77    #        return self._visit_constraint_fk(constraint)
78    #    return super(MySQLConstraintDropper,self).visit_constraint(constraint)
79
80    def visit_migrate_primary_key_constraint(self, constraint):
81        self.start_alter_table(constraint)
82        self.append("DROP PRIMARY KEY")
83        self.execute()
84
85    def visit_migrate_foreign_key_constraint(self, constraint):
86        self.start_alter_table(constraint)
87        self.append("DROP FOREIGN KEY ")
88        self.append(constraint.name)
89        self.execute()
90
91    def _do_quote_table_identifier(self, identifier):
92        return '%s'%identifier
93
94
95class MySQLDialect(ansisql.ANSIDialect):
96    columngenerator = MySQLColumnGenerator
97    columndropper = MySQLColumnDropper
98    schemachanger = MySQLSchemaChanger
99    constraintgenerator = MySQLConstraintGenerator
100    constraintdropper = MySQLConstraintDropper
Note: リポジトリブラウザについてのヘルプは TracBrowser を参照してください。