Skip to content

Commit

Permalink
Issue #21 updated: migrate dbs when creating a DiffDatabaseMapping.
Browse files Browse the repository at this point in the history
  • Loading branch information
Manuel Marin committed Jan 25, 2019
1 parent 7a86268 commit 0e05275
Show file tree
Hide file tree
Showing 6 changed files with 114 additions and 70 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -15,13 +15,36 @@
branch_labels = None
depends_on = None

naming_convention = {
"fk": "fk_%(table_name)s_%(column_0_name)s_%(referred_table_name)s"
}

def upgrade():
with op.batch_alter_table("parameter_value") as batch_op:
try:
with op.batch_alter_table("next_id") as batch_op:
batch_op.alter_column('parameter_id', new_column_name='parameter_definition_id')
except sa.exc.NoSuchTableError:
pass
with op.batch_alter_table("parameter_value", naming_convention=naming_convention) as batch_op:
batch_op.alter_column('parameter_id', new_column_name='parameter_definition_id')
batch_op.drop_constraint('fk_parameter_value_parameter_id_parameter')
op.rename_table('parameter', 'parameter_definition')
with op.batch_alter_table("parameter_value", naming_convention=naming_convention) as batch_op:
batch_op.create_foreign_key(
"fk_parameter_value_parameter_definition_id_parameter_definition",
"parameter_definition", ["parameter_definition_id"], ["id"])

def downgrade():
op.rename_table('parameter_definition', 'parameter')
try:
with op.batch_alter_table("next_id") as batch_op:
batch_op.alter_column('parameter_definition_id', new_column_name='parameter_id')
except sa.exc.NoSuchTableError:
pass
with op.batch_alter_table("parameter_value") as batch_op:
batch_op.alter_column('parameter_definition_id', new_column_name='parameter_id')
batch_op.drop_constraint('fk_parameter_value_parameter_definition_id_parameter_definition')
op.rename_table('parameter_definition', 'parameter')
with op.batch_alter_table("parameter_value", naming_convention=naming_convention) as batch_op:
batch_op.create_foreign_key(
"fk_parameter_value_parameter_id_parameter",
"parameter", ["parameter_id"], ["id"])
19 changes: 10 additions & 9 deletions spinedatabase_api/database_mapping.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@
from sqlalchemy.pool import StaticPool
from sqlalchemy.exc import NoSuchTableError, DBAPIError, DatabaseError
from .exception import SpineDBAPIError, SpineTableNotFoundError, RecordNotFoundError, ParameterValueError
from .helpers import custom_generate_relationship, attr_dict
from .helpers import custom_generate_relationship, attr_dict, do_migration
from datetime import datetime, timezone

# TODO: Consider returning lists of dict (with _asdict()) rather than queries,
Expand Down Expand Up @@ -65,6 +65,7 @@ def __init__(self, db_url, username=None, create_all=True):
self.Parameter = None
self.ParameterValue = None
self.Commit = None
do_migration(db_url)
if create_all:
self.create_engine_and_session()
self.create_mapping()
Expand Down Expand Up @@ -99,7 +100,7 @@ def create_mapping(self):
self.Object = self.Base.classes.object
self.RelationshipClass = self.Base.classes.relationship_class
self.Relationship = self.Base.classes.relationship
self.Parameter = self.Base.classes.parameter
self.Parameter = self.Base.classes.parameter_definition
self.ParameterValue = self.Base.classes.parameter_value
self.Commit = self.Base.classes.commit
except NoSuchTableError as table:
Expand Down Expand Up @@ -266,7 +267,7 @@ def single_object_parameter_value(self, id=None, parameter_id=None, object_id=No
if id:
return qry.filter(self.ParameterValue.id == id)
if parameter_id and object_id:
return qry.filter(self.ParameterValue.parameter_id == parameter_id).\
return qry.filter(self.ParameterValue.parameter_definition_id == parameter_id).\
filter(self.ParameterValue.object_id == object_id)
return self.empty_list()

Expand Down Expand Up @@ -452,7 +453,7 @@ def parameter_value_list(self, id_list=set(), object_id=None, relationship_id=No
"""Return parameter values."""
qry = self.session.query(
self.ParameterValue.id,
self.ParameterValue.parameter_id,
self.ParameterValue.parameter_definition_id,
self.ParameterValue.object_id,
self.ParameterValue.relationship_id,
self.ParameterValue.index,
Expand Down Expand Up @@ -490,7 +491,7 @@ def object_parameter_value_list(self, parameter_name=None):
self.ParameterValue.time_pattern,
self.ParameterValue.time_series_id,
self.ParameterValue.stochastic_model_id
).filter(parameter_list.c.id == self.ParameterValue.parameter_id).\
).filter(parameter_list.c.id == self.ParameterValue.parameter_definition_id).\
filter(self.ParameterValue.object_id == object_list.c.id).\
filter(parameter_list.c.object_class_id == object_class_list.c.id)
if parameter_name:
Expand Down Expand Up @@ -519,7 +520,7 @@ def relationship_parameter_value_list(self, parameter_name=None):
self.ParameterValue.time_pattern,
self.ParameterValue.time_series_id,
self.ParameterValue.stochastic_model_id
).filter(parameter_list.c.id == self.ParameterValue.parameter_id).\
).filter(parameter_list.c.id == self.ParameterValue.parameter_definition_id).\
filter(self.ParameterValue.relationship_id == wide_relationship_list.c.id).\
filter(parameter_list.c.relationship_class_id == wide_relationship_class_list.c.id)
if parameter_name:
Expand All @@ -543,7 +544,7 @@ def all_object_parameter_value_list(self, parameter_id=None):
self.ParameterValue.stochastic_model_id
).filter(self.ParameterValue.object_id == self.Object.id).\
outerjoin(self.ParameterValue).\
filter(self.Parameter.id == self.ParameterValue.parameter_id)
filter(self.Parameter.id == self.ParameterValue.parameter_definition_id)
if parameter_id:
qry = qry.filter(self.Parameter.id == parameter_id)
return qry
Expand All @@ -553,7 +554,7 @@ def unvalued_object_parameter_list(self, object_id):
object_ = self.single_object(id=object_id).one_or_none()
if not object_:
return self.empty_list()
valued_parameter_ids = self.session.query(self.ParameterValue.parameter_id).\
valued_parameter_ids = self.session.query(self.ParameterValue.parameter_definition_id).\
filter_by(object_id=object_id)
return self.parameter_list(object_class_id=object_.class_id).\
filter(~self.Parameter.id.in_(valued_parameter_ids))
Expand All @@ -574,7 +575,7 @@ def unvalued_relationship_parameter_list(self, relationship_id):
relationship = self.single_wide_relationship(id=relationship_id).one_or_none()
if not relationship:
return self.empty_list()
valued_parameter_ids = self.session.query(self.ParameterValue.parameter_id).\
valued_parameter_ids = self.session.query(self.ParameterValue.parameter_definition_id).\
filter_by(relationship_id=relationship_id)
return self.parameter_list().filter_by(relationship_class_id=relationship.class_id).\
filter(~self.Parameter.id.in_(valued_parameter_ids))
Expand Down
Loading

0 comments on commit 0e05275

Please sign in to comment.