python - 如何在 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 字段成为主键或确保我可以在此关联表中存储重复的颜色?
解决方案
所以我所做的就是将表格更改为模型。
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
然后调用color
from each game_color
。
推荐阅读
- vba - 为具有不同数据量的列自动生成频率和直方图
- scheme - 试图编写一个返回另一个函数的函数,但 Racket 说我的 lambda 不是函数定义?
- javascript - 我如何使用 JS 将图像链接到锚标记?(我正在使用 cloud firestore 工作的功能,管理员的新游戏添加选项)
- java - 减法给出奇怪的结果 [Java]
- asp.net - 无法在 Web api 配置中设置自定义合同解析器
- postgresql - 将 PostgreSQL Alpine 映像切换到 Debian 并从 12.3 升级到 12.6 后出现“信号 11:分段错误”错误
- javascript - 我们应该检查前端 JavaScript 代码的漏洞吗?
- spring-boot - 在 Spring Boot 中使用 Google 登录后重定向到页面用户
- javascript - Node.js 在后端和前端之间共享代码
- go - 我们如何管理 Rest API 查询参数中的“#”