mirror of
https://github.com/Infinidat/infi.clickhouse_orm.git
synced 2024-11-25 10:13:45 +03:00
Migrations - cannot add a new materialized field after a regular field
This commit is contained in:
parent
7aef68ab14
commit
efe270b502
|
@ -6,6 +6,7 @@ Unreleased
|
||||||
- Added `timeout` parameter to database initializer (SUHAR1K)
|
- Added `timeout` parameter to database initializer (SUHAR1K)
|
||||||
- Added `verify_ssl_cert` parameter to database initializer
|
- Added `verify_ssl_cert` parameter to database initializer
|
||||||
- Added `final()` method to querysets (M1hacka)
|
- Added `final()` method to querysets (M1hacka)
|
||||||
|
- Fixed a migrations problem - cannot add a new materialized field after a regular field
|
||||||
|
|
||||||
v1.0.3
|
v1.0.3
|
||||||
------
|
------
|
||||||
|
|
|
@ -75,13 +75,16 @@ class AlterTable(Operation):
|
||||||
# Identify fields that were added to the model
|
# Identify fields that were added to the model
|
||||||
prev_name = None
|
prev_name = None
|
||||||
for name, field in iteritems(self.model_class.fields()):
|
for name, field in iteritems(self.model_class.fields()):
|
||||||
|
is_regular_field = not (field.materialized or field.alias)
|
||||||
if name not in table_fields:
|
if name not in table_fields:
|
||||||
logger.info(' Add column %s', name)
|
logger.info(' Add column %s', name)
|
||||||
assert prev_name, 'Cannot add a column to the beginning of the table'
|
assert prev_name, 'Cannot add a column to the beginning of the table'
|
||||||
cmd = 'ADD COLUMN %s %s AFTER %s' % (name, field.get_sql(), prev_name)
|
cmd = 'ADD COLUMN %s %s' % (name, field.get_sql())
|
||||||
|
if is_regular_field:
|
||||||
|
cmd += ' AFTER %s' % prev_name
|
||||||
self._alter_table(database, cmd)
|
self._alter_table(database, cmd)
|
||||||
|
|
||||||
if not field.materialized and not field.alias:
|
if is_regular_field:
|
||||||
# ALIAS and MATERIALIZED fields are not stored in the database, and raise DatabaseError
|
# ALIAS and MATERIALIZED fields are not stored in the database, and raise DatabaseError
|
||||||
# (no AFTER column). So we will skip them
|
# (no AFTER column). So we will skip them
|
||||||
prev_name = name
|
prev_name = name
|
||||||
|
|
|
@ -93,10 +93,10 @@ class MigrationsTestCase(unittest.TestCase):
|
||||||
self.database.migrate('tests.sample_migrations', 14)
|
self.database.migrate('tests.sample_migrations', 14)
|
||||||
self.assertTrue(self.tableExists(MaterializedModel1))
|
self.assertTrue(self.tableExists(MaterializedModel1))
|
||||||
self.assertEqual(self.getTableFields(MaterializedModel1),
|
self.assertEqual(self.getTableFields(MaterializedModel1),
|
||||||
[('date_time', "DateTime"), ('int_field', 'Int8'), ('date', 'Date')])
|
[('date_time', 'DateTime'), ('int_field', 'Int8'), ('date', 'Date'), ('int_field_plus_one', 'Int8')])
|
||||||
self.assertTrue(self.tableExists(AliasModel1))
|
self.assertTrue(self.tableExists(AliasModel1))
|
||||||
self.assertEqual(self.getTableFields(AliasModel1),
|
self.assertEqual(self.getTableFields(AliasModel1),
|
||||||
[('date', 'Date'), ('int_field', 'Int8'), ('date_alias', "Date")])
|
[('date', 'Date'), ('int_field', 'Int8'), ('date_alias', 'Date'), ('int_field_plus_one', 'Int8')])
|
||||||
|
|
||||||
|
|
||||||
# Several different models with the same table name, to simulate a table that changes over time
|
# Several different models with the same table name, to simulate a table that changes over time
|
||||||
|
@ -183,6 +183,7 @@ class MaterializedModel1(Model):
|
||||||
date_time = DateTimeField()
|
date_time = DateTimeField()
|
||||||
date = DateField(materialized='toDate(date_time)')
|
date = DateField(materialized='toDate(date_time)')
|
||||||
int_field = Int8Field()
|
int_field = Int8Field()
|
||||||
|
int_field_plus_one = Int8Field(materialized='int_field + 1')
|
||||||
|
|
||||||
engine = MergeTree('date', ('date',))
|
engine = MergeTree('date', ('date',))
|
||||||
|
|
||||||
|
@ -206,6 +207,7 @@ class AliasModel1(Model):
|
||||||
date = DateField()
|
date = DateField()
|
||||||
date_alias = DateField(alias='date')
|
date_alias = DateField(alias='date')
|
||||||
int_field = Int8Field()
|
int_field = Int8Field()
|
||||||
|
int_field_plus_one = Int8Field(alias='int_field + 1')
|
||||||
|
|
||||||
engine = MergeTree('date', ('date',))
|
engine = MergeTree('date', ('date',))
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user