首页 > 解决方案 > 如何在 SQLAlchemy for Flask 中创建具有自动递增主键的关联表?

问题描述

我正在尝试在 Flask 中创建棋盘游戏 Mastermind 的虚拟版本。由于我需要存储有关当前游戏状态的信息,因此我使用 SQLAlchemy 和 SQLite 来实现这一目标。

游戏有一个随机生成的代码,用户必须猜测。此代码由可能重复的各种颜色组成。因为一个颜色可以用于多个游戏,所以是多对多的关系。所以我所做的是在游戏和颜色之间创建了一个关联表。

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 字段作为主键,以便游戏中的颜色组合可以包含重复的颜色。现在奇怪的是,当我在向游戏中添加一些重复的颜色后将更改提交到数据库时,它们将不会被保存。似乎它根本没有使用 id 字段。

如何使 id 字段成为主键或确保我可以在此关联表中存储重复的颜色?

标签: pythonsqliteflasksqlalchemy

解决方案


所以我所做的就是将表格更改为模型。

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 字段,所有重复记录在提交更改后保存。这个解决方案不像我希望的那样可行,因为你不能直接调用游戏可能具有的所有颜色。在这种情况下,您必须循环game.game_colors然后调用colorfrom each game_color


推荐阅读