Как обойти ограничение primary_key в SQLAlchemy?
Столкнулся с такой бедой в алхимии: не дает создавать зависимости без primary_key
Для наглядности (опустим опустил остальные поля), SQLAlchemy не даст создать таблицу Color_figure:
class Colors(_db.Model):
__tablename__ = "colors"
id = _db.Column(_db.Integer, primary_key=True, autoincrement=True)
name = _db.Column(_db.String(100), unique=True, nullable=False)
def __repr__(self):
return f"table colors: {self.id}, {self.name}"
class Figures(_db.Model):
__tablename__ = "figures"
id = _db.Column(_db.Integer, primary_key=True, autoincrement=True)
name = _db.Column(_db.String(100), unique=True, nullable=False)
def __repr__(self):
return f"table figures: {self.id}, {self.name}"
class Color_figure(_db.Model):
__tablename__ = "color_figure"
colors_id = _db.Column(_db.Integer, _db.ForeignKey('colors.id'))
figures_id = _db.Column(_db.Integer, _db.ForeignKey('figures.id'))
def __repr__(self):
return f"table color_figure : {self.category_id}, {self.presentation_id}"
Да, понимаю, что можно организовать например так:
class Colors(_db.Model):
__tablename__ = "colors"
id = _db.Column(_db.Integer, primary_key=True, autoincrement=True)
name = _db.Column(_db.String(100), unique=True, nullable=False)
def __repr__(self):
return f"table colors: {self.id}, {self.name}"
class Figures(_db.Model):
__tablename__ = "figures"
id = _db.Column(_db.Integer, primary_key=True, autoincrement=True)
name = _db.Column(_db.String(100), unique=True, nullable=False)
colors_id = _db.Column(_db.Integer, _db.ForeignKey('colors.id'))
def __repr__(self):
return f"table figures: {self.id}, {self.name}"
Но это как-то неправильно смотрится, т.к. получается, что таблица начинает расти горизонтально + если есть записи в БД, то тогда надо будет добавлять искусcтвено поле и делать его :
nullable=False
Кто подскажет, если сталкивался с такой проблемой, то что получается, что ничего поделать нельзя и придется горизонтально растить таблицу Figures?
UPD:
Предполагается, что каждая фигура может иметь только один цвет, т.е. отношение 1:1
UPD 2
Еще такой вариант реализации, можно реализовать:
class Color_figure(_db.Model):
__tablename__ = "color_figure"
colors_id = _db.Column(_db.Integer, primary_key=True, unique=True, nullable=False)
figures_id = _db.Column(_db.Integer, primary_key=True, unique=True, nullable=False)
Но в таком случает целостность данных не будет контролироваться, например можно легко удалить запись о цвете или фигуре, и SQLAlchemy ругаться не будет...