[3] | 1 | """ |
---|
| 2 | `SQLite`_ database specific implementations of changeset classes. |
---|
| 3 | |
---|
| 4 | .. _`SQLite`: http://www.sqlite.org/ |
---|
| 5 | """ |
---|
| 6 | from migrate.changeset import ansisql, constraint, exceptions |
---|
| 7 | from sqlalchemy.databases import sqlite as sa_base |
---|
| 8 | from sqlalchemy import Table, MetaData |
---|
| 9 | #import sqlalchemy as sa |
---|
| 10 | |
---|
| 11 | SQLiteSchemaGenerator = sa_base.SQLiteSchemaGenerator |
---|
| 12 | |
---|
| 13 | |
---|
| 14 | class SQLiteHelper(object): |
---|
| 15 | |
---|
| 16 | def visit_column(self, param): |
---|
| 17 | try: |
---|
| 18 | table = self._to_table(param.table) |
---|
| 19 | except: |
---|
| 20 | table = self._to_table(param) |
---|
| 21 | raise |
---|
| 22 | table_name = self._to_table_name(table) |
---|
| 23 | self.append('ALTER TABLE %s RENAME TO migration_tmp' % table_name) |
---|
| 24 | self.execute() |
---|
| 25 | |
---|
| 26 | insertion_string = self._modify_table(table, param) |
---|
| 27 | |
---|
| 28 | table.create() |
---|
| 29 | self.append(insertion_string % {'table_name': table_name}) |
---|
| 30 | self.execute() |
---|
| 31 | self.append('DROP TABLE migration_tmp') |
---|
| 32 | self.execute() |
---|
| 33 | |
---|
| 34 | |
---|
| 35 | class SQLiteColumnGenerator(SQLiteSchemaGenerator, |
---|
| 36 | ansisql.ANSIColumnGenerator): |
---|
| 37 | pass |
---|
| 38 | |
---|
| 39 | |
---|
| 40 | class SQLiteColumnDropper(SQLiteHelper, ansisql.ANSIColumnDropper): |
---|
| 41 | |
---|
| 42 | def _modify_table(self, table, column): |
---|
| 43 | del table.columns[column.name] |
---|
| 44 | columns = ','.join([c.name for c in table.columns]) |
---|
| 45 | return 'INSERT INTO %(table_name)s SELECT ' + columns + \ |
---|
| 46 | ' from migration_tmp' |
---|
| 47 | |
---|
| 48 | |
---|
| 49 | class SQLiteSchemaChanger(SQLiteHelper, ansisql.ANSISchemaChanger): |
---|
| 50 | |
---|
| 51 | def _not_supported(self, op): |
---|
| 52 | raise exceptions.NotSupportedError("SQLite does not support " |
---|
| 53 | "%s; see http://www.sqlite.org/lang_altertable.html"%op) |
---|
| 54 | |
---|
| 55 | def _modify_table(self, table, delta): |
---|
| 56 | column = table.columns[delta.current_name] |
---|
| 57 | for k, v in delta.items(): |
---|
| 58 | setattr(column, k, v) |
---|
| 59 | return 'INSERT INTO %(table_name)s SELECT * from migration_tmp' |
---|
| 60 | |
---|
| 61 | def visit_index(self, param): |
---|
| 62 | self._not_supported('ALTER INDEX') |
---|
| 63 | |
---|
| 64 | def _do_quote_column_identifier(self, identifier): |
---|
| 65 | return '"%s"'%identifier |
---|
| 66 | |
---|
| 67 | |
---|
| 68 | class SQLiteConstraintGenerator(ansisql.ANSIConstraintGenerator): |
---|
| 69 | |
---|
| 70 | def visit_migrate_primary_key_constraint(self, constraint): |
---|
| 71 | tmpl = "CREATE UNIQUE INDEX %s ON %s ( %s )" |
---|
| 72 | cols = ','.join([c.name for c in constraint.columns]) |
---|
| 73 | tname = constraint.table.name |
---|
| 74 | name = constraint.name |
---|
| 75 | msg = tmpl % (name, tname, cols) |
---|
| 76 | self.append(msg) |
---|
| 77 | self.execute() |
---|
| 78 | |
---|
| 79 | |
---|
| 80 | class SQLiteFKGenerator(SQLiteSchemaChanger, ansisql.ANSIFKGenerator): |
---|
| 81 | def visit_column(self, column): |
---|
| 82 | """Create foreign keys for a column (table already exists); #32""" |
---|
| 83 | |
---|
| 84 | if self.fk: |
---|
| 85 | self._not_supported("ALTER TABLE ADD FOREIGN KEY") |
---|
| 86 | |
---|
| 87 | if self.buffer.getvalue() !='': |
---|
| 88 | self.execute() |
---|
| 89 | |
---|
| 90 | |
---|
| 91 | class SQLiteConstraintDropper(ansisql.ANSIColumnDropper): |
---|
| 92 | |
---|
| 93 | def visit_migrate_primary_key_constraint(self, constraint): |
---|
| 94 | tmpl = "DROP INDEX %s " |
---|
| 95 | name = constraint.name |
---|
| 96 | msg = tmpl % (name) |
---|
| 97 | self.append(msg) |
---|
| 98 | self.execute() |
---|
| 99 | |
---|
| 100 | |
---|
| 101 | class SQLiteDialect(ansisql.ANSIDialect): |
---|
| 102 | columngenerator = SQLiteColumnGenerator |
---|
| 103 | columndropper = SQLiteColumnDropper |
---|
| 104 | schemachanger = SQLiteSchemaChanger |
---|
| 105 | constraintgenerator = SQLiteConstraintGenerator |
---|
| 106 | constraintdropper = SQLiteConstraintDropper |
---|
| 107 | columnfkgenerator = SQLiteFKGenerator |
---|