summaryrefslogtreecommitdiff
path: root/migrate/changeset/databases
diff options
context:
space:
mode:
authorjan.dittberner <unknown>2008-12-30 20:43:40 +0000
committerjan.dittberner <unknown>2008-12-30 20:43:40 +0000
commit05819a6f70fbb508cb3856808c9ae1132a356f24 (patch)
tree6cf138a0edcdd78c074000cfcdc1d9fba08fa521 /migrate/changeset/databases
parentb73aa25733dec0bcbd9f4f6a66a026a53cbab0eb (diff)
downloadsqlalchemy-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.py50
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 "