0

我有一个游戏表,我想将每个游戏中的动作保存在这个表中。我能想到的唯一方法(不使用泡菜)是为每个游戏设置另一个表来保存动作集。我的问题是我不确定如何在 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))

这(^^^)是我的数据库模式。

4

1 回答 1

0

这是一个关于基本数据库设计的问题。您可以考虑如何在没有 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

于 2021-03-29T08:27:42.530 回答