Mercurial > kallithea
comparison rhodecode/lib/dbmigrate/migrate/changeset/databases/oracle.py @ 833:9753e0907827 beta
added dbmigrate package, added model changes
moved out upgrade db command to that package
author | Marcin Kuzminski <marcin@python-works.com> |
---|---|
date | Sat, 11 Dec 2010 01:54:12 +0100 |
parents | |
children | 08d2dcd71666 |
comparison
equal
deleted
inserted
replaced
832:634596f81cfd | 833:9753e0907827 |
---|---|
1 """ | |
2 Oracle database specific implementations of changeset classes. | |
3 """ | |
4 import sqlalchemy as sa | |
5 from sqlalchemy.databases import oracle as sa_base | |
6 | |
7 from migrate import exceptions | |
8 from migrate.changeset import ansisql, SQLA_06 | |
9 | |
10 | |
11 if not SQLA_06: | |
12 OracleSchemaGenerator = sa_base.OracleSchemaGenerator | |
13 else: | |
14 OracleSchemaGenerator = sa_base.OracleDDLCompiler | |
15 | |
16 | |
17 class OracleColumnGenerator(OracleSchemaGenerator, ansisql.ANSIColumnGenerator): | |
18 pass | |
19 | |
20 | |
21 class OracleColumnDropper(ansisql.ANSIColumnDropper): | |
22 pass | |
23 | |
24 | |
25 class OracleSchemaChanger(OracleSchemaGenerator, ansisql.ANSISchemaChanger): | |
26 | |
27 def get_column_specification(self, column, **kwargs): | |
28 # Ignore the NOT NULL generated | |
29 override_nullable = kwargs.pop('override_nullable', None) | |
30 if override_nullable: | |
31 orig = column.nullable | |
32 column.nullable = True | |
33 ret = super(OracleSchemaChanger, self).get_column_specification( | |
34 column, **kwargs) | |
35 if override_nullable: | |
36 column.nullable = orig | |
37 return ret | |
38 | |
39 def visit_column(self, delta): | |
40 keys = delta.keys() | |
41 | |
42 if 'name' in keys: | |
43 self._run_subvisit(delta, | |
44 self._visit_column_name, | |
45 start_alter=False) | |
46 | |
47 if len(set(('type', 'nullable', 'server_default')).intersection(keys)): | |
48 self._run_subvisit(delta, | |
49 self._visit_column_change, | |
50 start_alter=False) | |
51 | |
52 def _visit_column_change(self, table, column, delta): | |
53 # Oracle cannot drop a default once created, but it can set it | |
54 # to null. We'll do that if default=None | |
55 # http://forums.oracle.com/forums/message.jspa?messageID=1273234#1273234 | |
56 dropdefault_hack = (column.server_default is None \ | |
57 and 'server_default' in delta.keys()) | |
58 # Oracle apparently doesn't like it when we say "not null" if | |
59 # the column's already not null. Fudge it, so we don't need a | |
60 # new function | |
61 notnull_hack = ((not column.nullable) \ | |
62 and ('nullable' not in delta.keys())) | |
63 # We need to specify NULL if we're removing a NOT NULL | |
64 # constraint | |
65 null_hack = (column.nullable and ('nullable' in delta.keys())) | |
66 | |
67 if dropdefault_hack: | |
68 column.server_default = sa.PassiveDefault(sa.sql.null()) | |
69 if notnull_hack: | |
70 column.nullable = True | |
71 colspec = self.get_column_specification(column, | |
72 override_nullable=null_hack) | |
73 if null_hack: | |
74 colspec += ' NULL' | |
75 if notnull_hack: | |
76 column.nullable = False | |
77 if dropdefault_hack: | |
78 column.server_default = None | |
79 | |
80 self.start_alter_table(table) | |
81 self.append("MODIFY (") | |
82 self.append(colspec) | |
83 self.append(")") | |
84 | |
85 | |
86 class OracleConstraintCommon(object): | |
87 | |
88 def get_constraint_name(self, cons): | |
89 # Oracle constraints can't guess their name like other DBs | |
90 if not cons.name: | |
91 raise exceptions.NotSupportedError( | |
92 "Oracle constraint names must be explicitly stated") | |
93 return cons.name | |
94 | |
95 | |
96 class OracleConstraintGenerator(OracleConstraintCommon, | |
97 ansisql.ANSIConstraintGenerator): | |
98 pass | |
99 | |
100 | |
101 class OracleConstraintDropper(OracleConstraintCommon, | |
102 ansisql.ANSIConstraintDropper): | |
103 pass | |
104 | |
105 | |
106 class OracleDialect(ansisql.ANSIDialect): | |
107 columngenerator = OracleColumnGenerator | |
108 columndropper = OracleColumnDropper | |
109 schemachanger = OracleSchemaChanger | |
110 constraintgenerator = OracleConstraintGenerator | |
111 constraintdropper = OracleConstraintDropper |