【问题标题】:How do you create an association table with an auto increment primary key in SQLAlchemy for Flask?如何在 SQLAlchemy for Flask 中创建具有自动递增主键的关联表?
【发布时间】:2020-03-25 23:54:51
【问题描述】:

我正在尝试在 Flask 中创建棋盘游戏 Mastermind 的虚拟版本。由于我需要存储有关当前游戏状态的信息,因此我使用 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 字段作为主键,以便游戏中的颜色组合可以包含重复的颜色。现在奇怪的是,当我在向游戏中添加一些重复的颜色后将更改提交到数据库时,它们将不会被保存。似乎根本没有使用 id 字段。

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

【问题讨论】:

    标签: python sqlite flask sqlalchemy


    【解决方案1】:

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

    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,然后从每个game_color 调用color

    【讨论】:

      猜你喜欢
      • 2014-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-18
      • 2023-03-13
      • 2020-09-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多