diff options
| author | jan.dittberner <unknown> | 2008-12-30 20:43:40 +0000 |
|---|---|---|
| committer | jan.dittberner <unknown> | 2008-12-30 20:43:40 +0000 |
| commit | 05819a6f70fbb508cb3856808c9ae1132a356f24 (patch) | |
| tree | 6cf138a0edcdd78c074000cfcdc1d9fba08fa521 /migrate/changeset/databases | |
| parent | b73aa25733dec0bcbd9f4f6a66a026a53cbab0eb (diff) | |
| download | sqlalchemy-migrate-05819a6f70fbb508cb3856808c9ae1132a356f24.tar.gz | |
apply patch for Issue #43 (better SQLite support) by Florian Apolloner
Diffstat (limited to 'migrate/changeset/databases')
| -rw-r--r-- | migrate/changeset/databases/sqlite.py | 50 |
1 files changed, 37 insertions, 13 deletions
diff --git a/migrate/changeset/databases/sqlite.py b/migrate/changeset/databases/sqlite.py index a0b85d2..0f560c1 100644 --- a/migrate/changeset/databases/sqlite.py +++ b/migrate/changeset/databases/sqlite.py @@ -1,29 +1,52 @@ from migrate.changeset import ansisql,constraint,exceptions from sqlalchemy.databases import sqlite as sa_base +from sqlalchemy import Table, MetaData #import sqlalchemy as sa SQLiteSchemaGenerator = sa_base.SQLiteSchemaGenerator +class SQLiteHelper(object): + def visit_column(self, param): + try: + table = self._to_table(param.table) + except: + table = self._to_table(param) + raise + table_name = self._to_table_name(table) + self.append('ALTER TABLE %s RENAME TO migration_tmp' % table_name) + self.execute() + + insertion_string = self._modify_table(table, param) + + table.create() + self.append(insertion_string % {'table_name': table_name}) + self.execute() + self.append('DROP TABLE migration_tmp') + self.execute() + class SQLiteColumnGenerator(SQLiteSchemaGenerator,ansisql.ANSIColumnGenerator): pass -class SQLiteColumnDropper(ansisql.ANSIColumnDropper): - def visit_column(self,column): - raise exceptions.NotSupportedError("SQLite does not support " - "DROP COLUMN; see http://www.sqlite.org/lang_altertable.html") -class SQLiteSchemaChanger(ansisql.ANSISchemaChanger): + +class SQLiteColumnDropper(SQLiteHelper, ansisql.ANSIColumnDropper): + def _modify_table(self,table, column): + del table.columns[column.name] + columns = ','.join([c.name for c in table.columns]) + return 'INSERT INTO %(table_name)s SELECT ' + columns + ' from migration_tmp' + +class SQLiteSchemaChanger(SQLiteHelper, ansisql.ANSISchemaChanger): def _not_supported(self,op): raise exceptions.NotSupportedError("SQLite does not support " "%s; see http://www.sqlite.org/lang_altertable.html"%op) - def _visit_column_nullable(self,table_name,col_name,delta): - return self._not_supported('ALTER TABLE') - def _visit_column_default(self,table_name,col_name,delta): - return self._not_supported('ALTER TABLE') - def _visit_column_type(self,table_name,col_name,delta): - return self._not_supported('ALTER TABLE') - def _visit_column_name(self,table_name,col_name,delta): - return self._not_supported('ALTER TABLE') + + def _modify_table(self, table, delta): + column = table.columns[delta.current_name] + for k,v in delta.items(): + setattr(column, k, v) + return 'INSERT INTO %(table_name)s SELECT * from migration_tmp' + def visit_index(self,param): self._not_supported('ALTER INDEX') + def _do_quote_column_identifier(self, identifier): return '"%s"'%identifier @@ -36,6 +59,7 @@ class SQLiteConstraintGenerator(ansisql.ANSIConstraintGenerator): msg = tmpl%(name,tname,cols) self.append(msg) self.execute() + class SQLiteConstraintDropper(ansisql.ANSIColumnDropper): def visit_migrate_primary_key_constraint(self,constraint): tmpl = "DROP INDEX %s " |
