我对 SQL 感到生疏,而且完全不了解 SQL Alchemy,但我有一个即将使用两者的项目。因此,我想写点东西来适应一下。在宿醉的情况下,我决定写点东西来跟踪酒精水平。
我有事件
,参与其中的用户
会消费饮料
。这是我的三个基本表(还有一个帮助表guestlist
,用于映射用户和事件之间的m:n关系)。
饮料列出了所有事件中所有用户随时可以使用的饮料(无需映射任何内容)。用户和事件都会不时地创建,所有用户都可以加入所有事件,因此我使用guestlist
表来映射这些内容。
shots
来解决这个问题(见下文),但我不确定这是否是一个好的解决方案。
![ERP Diagram](https://istack.dev59.com/pofSE.webp)
guestlist_table = Table('guestlist', Base.metadata,
Column('event_id', Integer, ForeignKey('events.id')),
Column('user_id', Integer, ForeignKey('users.id'))
)
class Event(Base):
__tablename__ = 'events'
id = Column(Integer, primary_key=True)
name = Column(String(80), nullable=False)
started = Column(DateTime, nullable=False, index=True,
default=datetime.datetime.now
)
users = relationship("User", secondary=guestlist_table, backref="events")
# ...
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String(50), nullable=False, unique=True, index=True)
birthdate = Column(Date, nullable=False)
weight = Column(Integer, nullable=False)
sex = Column(Boolean, nullable=False)
# ...
class Drink(Base):
__tablename__ = 'drinks'
id = Column(Integer, primary_key=True)
name = Column(String(50), nullable=False)
volume = Column(Numeric(5,2), nullable=False)
percent = Column(Numeric(5,2), nullable=False)
# ...
class Shots(Base):
__tablename__ = 'shots'
id = Column(Integer, primary_key=True)
at = Column(DateTime, nullable=False,
default=datetime.datetime.now
)
user_id = Column(Integer, ForeignKey('users.id'), index=True)
event_id = Column(Integer, ForeignKey('events.id'), index=True)
drink_id = Column(Integer, ForeignKey('drinks.id'))
user = relationship("User", backref="shots")
event = relationship("Event", backref="shots")
drink = relationship("Drink", uselist=False) # one-to-one, no backref needed
我很难找到一个好的方法来构建一个将“事件”、“用户”和“饮料”映射在一起的表格:我应该如何制定关系,以及如何查询它? 问题是我感觉我忽视了某些东西。 而且坦率地说,我完全不知道如何查询它?
以下是我大部分时间要进行的查询:
- 我至少需要获取在活动中消耗的所有Shot(可能按用户排序) - 有时我也需要特定用户的所有Shot(可能按活动排序) - 还有很多计数:
- 每个事件的Shot数量 - 每个用户的Shot数量 - 用户在事件上喝下的Shot数量
shots
表是管理这个的好方法吗?
drinklist
。你所称的guestdrinklist
我试图在Shots
类中建模。将该类拆分成两个表是否更好? - Brutus__table_args__ = ( ForeignKeyConstraint( ["user_id", "event_id"], ["guestlist.user_id", "guestlist.event_id"], name="fk_guestlist", ), )
- van