Как обойти ограничение primary_key в SQLAlchemy?

Рейтинг: 0Ответов: 0Опубликовано: 17.02.2023

Столкнулся с такой бедой в алхимии: не дает создавать зависимости без 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 ругаться не будет...

Ответы

Ответов пока нет.