Как создать таблицу ассоциации с первичным ключом с автоинкрементом в SQLAlchemy для Flask? - PullRequest
1 голос
/ 26 марта 2020

Я пытаюсь создать виртуальную версию настольной игры Mastermind в Flask. Поскольку мне нужно хранить информацию о текущем состоянии игры, для достижения этой цели я использую SQLAlchemy с SQLite.

В игре есть случайно сгенерированный код, который должен угадать пользователь. Этот код состоит из различных цветов, которые могут дублироваться. Поскольку цвет можно использовать для нескольких игр, это отношение многих ко многим. Итак, я создал таблицу ассоциации между Game и Color.

game_colors = db.Table("game_colors",
    db.Column("id", db.Integer, primary_key=True),
    db.Column("game_id", db.Integer, db.ForeignKey("game.id")),
    db.Column("color_id", db.Integer, db.ForeignKey("color.id"))
)

Я добавил поле id в качестве первичного ключа, чтобы комбинация цветов из игры могла состоять из дублированных цветов. Теперь странным моментом является то, что когда я добавляю свои изменения в базу данных после добавления нескольких дублирующих цветов в игру, они не сохраняются. Похоже, что оно вообще не использует поле идентификатора.

Как сделать поле идентификатора первичным ключом или убедиться, что я могу хранить повторяющиеся цвета в этой таблице ассоциации?

1 Ответ

1 голос
/ 01 апреля 2020

Поэтому я изменил таблицу на модель.

class GameColor(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    game_id = db.Column(db.Integer, db.ForeignKey('game.id'), nullable=False)
    color_id = db.Column(db.Integer, db.ForeignKey('color.id'), nullable=False)

    game = db.relationship('Game', back_populates='game_colors')
    color = db.relationship('Color', back_populates='game_colors')

В этой модели поле id фактически используется, и все повторяющиеся записи сохраняются после фиксации изменений. Это решение не столь жизнеспособно, как я бы надеялся, поскольку вы не можете напрямую назвать все цвета, которые может иметь игра. В этом случае вам придется набрать oop больше game.game_colors, а затем набрать color с каждого game_color.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...