在一行中创建一个 Sqlalchemy table 以保存国际象棋移动集
Creating an Sqlalchemy table within a row to save chess move set
我有 table 个游戏,我想在这个 table 中保存每个游戏中的移动。我能想到的唯一方法(不使用泡菜)是为每个游戏设置另一个 table 来保存移动集。我的问题是我不确定如何在 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 的情况下仅使用数据库来设计这种需求? table 之间的关系,这里是 Game->Move,是一个一对多的关系,也应该在数据库 table 中声明。参见 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
我有 table 个游戏,我想在这个 table 中保存每个游戏中的移动。我能想到的唯一方法(不使用泡菜)是为每个游戏设置另一个 table 来保存移动集。我的问题是我不确定如何在 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 的情况下仅使用数据库来设计这种需求? table 之间的关系,这里是 Game->Move,是一个一对多的关系,也应该在数据库 table 中声明。参见 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