diff --git a/clld/db/models/parameter.py b/clld/db/models/parameter.py index cb81fd72..a0513029 100644 --- a/clld/db/models/parameter.py +++ b/clld/db/models/parameter.py @@ -41,10 +41,11 @@ class DomainElement(Base, """DomainElements can be used to model controlled lists of values for a Parameter.""" __table_args__ = ( - UniqueConstraint('name', 'parameter_pk'), - UniqueConstraint('number', 'parameter_pk')) + UniqueConstraint('parameter_pk', 'name'), + UniqueConstraint('parameter_pk', 'number'), + ) - parameter_pk = Column(Integer, ForeignKey('parameter.pk')) + parameter_pk = Column(Integer, ForeignKey('parameter.pk'), nullable=False) number = Column(Integer, doc='numerical value of the domain element') """the number is used to sort domain elements within the domain of one parameter""" diff --git a/clld/db/models/unit.py b/clld/db/models/unit.py index c30174b5..98b256c1 100644 --- a/clld/db/models/unit.py +++ b/clld/db/models/unit.py @@ -1,6 +1,6 @@ from __future__ import unicode_literals, print_function, division, absolute_import -from sqlalchemy import Column, Integer, ForeignKey +from sqlalchemy import Column, Integer, ForeignKey, UniqueConstraint from sqlalchemy.orm import relationship from zope.interface import implementer @@ -32,11 +32,12 @@ class Unit(Base, IdNameDescriptionMixin, HasDataMixin, HasFilesMixin): - """A linguistic unit of a language.""" - language_pk = Column(Integer, ForeignKey('language.pk')) - language = relationship(Language) + __table_args__ = (UniqueConstraint('language_pk', 'id'),) + + language_pk = Column(Integer, ForeignKey('language.pk'), nullable=False) + language = relationship(Language, innerjoin=True) def __solr__(self, req): return _add_solr_language_info(Base.__solr__(self, req), self) diff --git a/clld/db/models/unitparameter.py b/clld/db/models/unitparameter.py index e90f5810..580138fb 100644 --- a/clld/db/models/unitparameter.py +++ b/clld/db/models/unitparameter.py @@ -1,6 +1,6 @@ from __future__ import unicode_literals, print_function, division, absolute_import -from sqlalchemy import Column, Integer, ForeignKey +from sqlalchemy import Column, Integer, ForeignKey, UniqueConstraint from sqlalchemy.orm import relationship from zope.interface import implementer @@ -32,7 +32,12 @@ class UnitDomainElement(Base, """Domain element for the domain of a UnitParameter.""" - unitparameter_pk = Column(Integer, ForeignKey('unitparameter.pk')) + __table_args__ = ( + UniqueConstraint('unitparameter_pk', 'name'), + UniqueConstraint('unitparameter_pk', 'ord'), + ) + + unitparameter_pk = Column(Integer, ForeignKey('unitparameter.pk'), nullable=False) ord = Column(Integer) def url(self, request): diff --git a/clld/db/schema_migrations/update_assoc_tables.py b/clld/db/schema_migrations/update_unique_null.py similarity index 92% rename from clld/db/schema_migrations/update_assoc_tables.py rename to clld/db/schema_migrations/update_unique_null.py index e36ebc3e..70da656b 100644 --- a/clld/db/schema_migrations/update_assoc_tables.py +++ b/clld/db/schema_migrations/update_unique_null.py @@ -1,9 +1,4 @@ -# update_assoc_tables.py - adapt unique and nullable - -# TODO: DomainElement: reverse UNIQUE(name, parameter_pk)?, parameter_pk NOT NULL? -# TODO: LanguageSource: orm.relationships missing? -# TODO: Unit: language_pk NOT_NULL, innerjoin=True? -# TODO: UnitDomainElement: add UNIQUE(unitparameter_pk, name)?, unitparameter_pk NOT NULL? +# update_unique_null.py - adapt composite unique constraints and nullables from __future__ import unicode_literals @@ -30,6 +25,12 @@ ('contributionreference', ['contribution_pk', 'source_pk', 'description'], ['description']), + ('domainelement', + ['parameter_pk', 'name'], + ['name']), + ('domainelement', + ['parameter_pk', 'number'], + ['number']), ('editor', ['dataset_pk', 'contributor_pk'], []), ('languageidentifier', @@ -39,6 +40,15 @@ ('sentencereference', ['sentence_pk', 'source_pk', 'description'], ['description']), + ('unit', + ['language_pk', 'id'], # FIXME: or rather name? + ['id']), + ('unitdomainelement', + ['unitparameter_pk', 'name'], + ['name']), + ('unitdomainelement', + ['unitparameter_pk', 'ord'], + ['ord']), ('unitvalue', # NOTE: can have multiple values and also multiple unitdomainelements ['unit_pk', 'unitparameter_pk', 'contribution_pk', 'name', 'unitdomainelement_pk'], ['contribution_pk', 'name', 'unitdomainelement_pk']),