python - 在一行中创建一个 Sqlalchemy 表以保存国际象棋移动集
问题描述
我有一个游戏表,我想将每个游戏中的动作保存在这个表中。我能想到的唯一方法(不使用泡菜)是为每个游戏设置另一个表来保存动作集。我的问题是我不确定如何在 Sqlalchemy 中做到这一点,而且我在其他地方找不到答案。我是被迫使用泡菜类型还是有更好的方法我没有看到?
使用 Python 3.8.5 和最新版本的 Sqlalchemy。
import datetime
from sqlalchemy import Column, DateTime, Integer, String, Date, ForeignKey, Float, Boolean, DateTime, PickleType
from sqlalchemy.ext.declarative import declarative_base
from flask_login import UserMixin
Base = declarative_base()
class Move(Base):
__tablename__ = 'moves'
id = Column(Integer, primary_key = True)
move = Column(String)
start_time = Column(Integer)
end_time = Column(Integer)
white = Column(Boolean)
class Game(Base):
__tablename__ = 'games'
id = Column(Integer, primary_key = True)
white_id = Column(Integer)
black_id = Column(Integer)
board = Column(PickleType)
move_table_name = Column(String)
class User(Base , UserMixin):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
username = Column(String(15), unique=True)
email = Column(String(50), unique=True)
password = Column(String(80))
这(^^^)是我的数据库模式。
解决方案
这是一个关于基本数据库设计的问题。您可以考虑如何在没有 sqlalchemy 的情况下仅使用数据库来设计这种需求?表之间的关系,这里是 Game->Move,是一对多的关系,也应该在数据库表中声明。请参阅https://database.guide/the-3-types-of-relationships-in-database-design。
使用 SqlAlchemy 关系可以设计如下:
class Move(Base):
__tablename__ = 'moves'
id = Column(Integer, primary_key = True)
game_id = Column(Integer, ForeignKey('games.id'))
move = Column(String)
start_time = Column(Integer)
end_time = Column(Integer)
white = Column(Boolean)
class Game(Base):
__tablename__ = 'games'
id = Column(Integer, primary_key = True)
white_id = Column(Integer, ForeignKey('users.id'))
black_id = Column(Integer, ForeignKey('users.id'))
board = Column(PickleType)
white = relationship("User", foreign_keys=[white_id])
black = relationship("User", foreign_keys=[black_id])
查看更多信息:https ://docs.sqlalchemy.org/en/14/orm/basic_relationships.html
推荐阅读
- mysql - 查找其他两列mysql中对的第三列的总和
- pandas - 如何使用熊猫查找列的最大值并按顺序排列它们?
- sql - 如何使用 SQL Server 中包含“&”的全文索引查询行?
- ios - UIView.animation 没有动画颜色变化
- angular - 如何使用角度更改鼠标输入的文本颜色
- linear-regression - 线性回归和特征缩放
- php - 卷文件更改不会在浏览器中传播
- javascript - 如何将具有许多状态变量的循环嵌套到表中?
- azure - Azure Blob 存储 - 检索在存储容器中读取或写入 blob 的用户
- ios - uistackview“跳跃”中排列的子视图内的动画