Simplify database model

This commit is contained in:
2024-02-14 13:57:53 +01:00
parent 916847760c
commit 2ca7cee539
7 changed files with 29 additions and 127 deletions

View File

@ -1,4 +1,4 @@
name,team_id,country_code
name,team,country_code
NONE,NONE,NO
Max Verstappen,RedBull,NL
Sergio Perez,RedBull,MX

1 name team_id team country_code
2 NONE NONE NO
3 Max Verstappen RedBull NL
4 Sergio Perez RedBull MX

View File

@ -1,24 +0,0 @@
name,country_code
Bahrain,BH
Saudi Arabia,SA
Melbourne,AU
Baku,AZ
Miami,US
Imola,IT
Monaco,MC
Barcelona,ES
Montreal,CA
Spielberg,AT
Silverstone,UK
Budapest,HU
Spa,BE
Zandvoort,NL
Monza,IT
Singapore,SG
Suzuka,JP
Qatar,QA
Austin,US
Mexico,MX
Brazil,BR
Las Vegas,US
Abu Dhabi,AE
1 name country_code
2 Bahrain BH
3 Saudi Arabia SA
4 Melbourne AU
5 Baku AZ
6 Miami US
7 Imola IT
8 Monaco MC
9 Barcelona ES
10 Montreal CA
11 Spielberg AT
12 Silverstone UK
13 Budapest HU
14 Spa BE
15 Zandvoort NL
16 Monza IT
17 Singapore SG
18 Suzuka JP
19 Qatar QA
20 Austin US
21 Mexico MX
22 Brazil BR
23 Las Vegas US
24 Abu Dhabi AE

View File

@ -1,4 +1,4 @@
id,grandprix_id,number,date
id,grandprix,number,date
1,Bahrain,1,2023-03-05
2,Saudi Arabia,2,2023-03-19
3,Melbourne,3,2023-04-02

1 id grandprix_id grandprix number date
2 1 Bahrain 1 2023-03-05
3 2 Saudi Arabia 2 2023-03-19
4 3 Melbourne 3 2023-04-02

View File

@ -1,12 +0,0 @@
name,country_code
NONE,NO
RedBull,UK
Mercedes,UK
Ferrari,IT
McLaren,UK
Aston Martin,UK
Alpine,UK
Williams,UK
AlphaTauri,IT
Alpha Romeo,CH
Haas,US
1 name country_code
2 NONE NO
3 RedBull UK
4 Mercedes UK
5 Ferrari IT
6 McLaren UK
7 Aston Martin UK
8 Alpine UK
9 Williams UK
10 AlphaTauri IT
11 Alpha Romeo CH
12 Haas US

View File

@ -24,21 +24,15 @@ def reload_static_data(db):
db.create_all()
# Clear static data
Team.query.delete()
Driver.query.delete()
GrandPrix.query.delete()
Race.query.delete()
RaceResult.query.delete()
User.query.delete()
Guess.query.delete()
# Reload static data
for row in load_csv("teams"):
db.session.add(Team().from_csv(row))
for row in load_csv("drivers"):
db.session.add(Driver().from_csv(row))
for row in load_csv("grandsprix"):
db.session.add(GrandPrix().from_csv(row))
for row in load_csv("races"):
db.session.add(Race().from_csv(row))
for row in load_csv("raceresults"):

108
model.py
View File

@ -6,50 +6,25 @@ from datetime import datetime
db = SQLAlchemy()
# This table contains meta information about the GPs, not specific to seasons (can be reused).
class GrandPrix(db.Model):
__tablename__ = "grandprix"
def from_csv(self, row):
self.name = str(row[0])
self.country_code = str(row[1])
return self
name: Mapped[str] = mapped_column(String(64), primary_key=True)
country_code: Mapped[str] = mapped_column(String(2)) # alpha-2 code
# This table contains manifestations of GPs, with dates
class Race(db.Model):
__tablename__ = "race"
def from_csv(self, row):
self.id = int(row[0])
self.grandprix_id = str(row[1])
self.grandprix = str(row[1])
self.number = int(row[2])
self.date = datetime.strptime(row[3], "%Y-%m-%d")
return self
id: Mapped[int] = mapped_column(Integer, primary_key=True)
grandprix_id: Mapped[str] = mapped_column(ForeignKey("grandprix.name"))
grandprix: Mapped[str] = mapped_column(String(32))
number: Mapped[int] = mapped_column(Integer)
date: Mapped[datetime] = mapped_column(DateTime)
grandprix: Mapped["GrandPrix"] = relationship("GrandPrix", foreign_keys=[grandprix_id])
# This table contains teams, e.g. RedBull
class Team(db.Model):
__tablename__ = "team"
def from_csv(self, row):
self.name = str(row[0])
self.country_code = str(row[1])
return self
name: Mapped[str] = mapped_column(String(32), primary_key=True)
country_code: Mapped[str] = mapped_column(String(2)) # alpha-2 code
# This table contains drivers and their team associations, e.g. Max Verschtappen
class Driver(db.Model):
@ -57,15 +32,15 @@ class Driver(db.Model):
def from_csv(self, row):
self.name = str(row[0])
self.team_id = str(row[1])
self.team = str(row[1])
self.country_code = str(row[2])
return self
name: Mapped[str] = mapped_column(String(32), primary_key=True)
team_id: Mapped[str] = mapped_column(ForeignKey("team.name"))
country_code: Mapped[str] = mapped_column(String(2)) # alpha-2 code
team: Mapped["Team"] = relationship("Team", foreign_keys=[team_id])
team: Mapped[str] = mapped_column(String(32))
country_code: Mapped[str] = mapped_column(String(2)) # alpha-2 code
class RaceResult(db.Model):
@ -79,53 +54,14 @@ class RaceResult(db.Model):
return self
id: Mapped[int] = mapped_column(Integer, primary_key=True)
race_id: Mapped[str] = mapped_column(ForeignKey("race.id"))
# These map to drivers
# p01_id: Mapped[int] = mapped_column(ForeignKey("driver.id"))
# p02_id: Mapped[int] = mapped_column(ForeignKey("driver.id"))
# p03_id: Mapped[int] = mapped_column(ForeignKey("driver.id"))
# p04_id: Mapped[int] = mapped_column(ForeignKey("driver.id"))
# p05_id: Mapped[int] = mapped_column(ForeignKey("driver.id"))
# p06_id: Mapped[int] = mapped_column(ForeignKey("driver.id"))
# p07_id: Mapped[int] = mapped_column(ForeignKey("driver.id"))
# p08_id: Mapped[int] = mapped_column(ForeignKey("driver.id"))
# p09_id: Mapped[int] = mapped_column(ForeignKey("driver.id"))
p10_id: Mapped[str] = mapped_column(ForeignKey("driver.name"))
# p11_id: Mapped[int] = mapped_column(ForeignKey("driver.id"))
# p12_id: Mapped[int] = mapped_column(ForeignKey("driver.id"))
# p13_id: Mapped[int] = mapped_column(ForeignKey("driver.id"))
# p14_id: Mapped[int] = mapped_column(ForeignKey("driver.id"))
# p15_id: Mapped[int] = mapped_column(ForeignKey("driver.id"))
# p16_id: Mapped[int] = mapped_column(ForeignKey("driver.id"))
# p17_id: Mapped[int] = mapped_column(ForeignKey("driver.id"))
# p18_id: Mapped[int] = mapped_column(ForeignKey("driver.id"))
# p19_id: Mapped[int] = mapped_column(ForeignKey("driver.id"))
# p20_id: Mapped[int] = mapped_column(ForeignKey("driver.id"))
dnf_id: Mapped[str] = mapped_column(ForeignKey("driver.name"))
race: Mapped["Race"] = relationship("Race", foreign_keys=[race_id])
# p01: Mapped["Driver"] = relationship("Driver", foreign_keys=[p01_id]) # Store all places to allow adding guesses
# p02: Mapped["Driver"] = relationship("Driver", foreign_keys=[p02_id])
# p03: Mapped["Driver"] = relationship("Driver", foreign_keys=[p03_id])
# p04: Mapped["Driver"] = relationship("Driver", foreign_keys=[p04_id])
# p05: Mapped["Driver"] = relationship("Driver", foreign_keys=[p05_id])
# p06: Mapped["Driver"] = relationship("Driver", foreign_keys=[p06_id])
# p07: Mapped["Driver"] = relationship("Driver", foreign_keys=[p07_id])
# p08: Mapped["Driver"] = relationship("Driver", foreign_keys=[p08_id])
# p09: Mapped["Driver"] = relationship("Driver", foreign_keys=[p09_id])
p10_id: Mapped[str] = mapped_column(ForeignKey("driver.name"))
p10: Mapped["Driver"] = relationship("Driver", foreign_keys=[p10_id])
# p11: Mapped["Driver"] = relationship("Driver", foreign_keys=[p11_id])
# p12: Mapped["Driver"] = relationship("Driver", foreign_keys=[p12_id])
# p13: Mapped["Driver"] = relationship("Driver", foreign_keys=[p13_id])
# p14: Mapped["Driver"] = relationship("Driver", foreign_keys=[p14_id])
# p15: Mapped["Driver"] = relationship("Driver", foreign_keys=[p15_id])
# p16: Mapped["Driver"] = relationship("Driver", foreign_keys=[p16_id])
# p17: Mapped["Driver"] = relationship("Driver", foreign_keys=[p17_id])
# p18: Mapped["Driver"] = relationship("Driver", foreign_keys=[p18_id])
# p19: Mapped["Driver"] = relationship("Driver", foreign_keys=[p19_id])
# p20: Mapped["Driver"] = relationship("Driver", foreign_keys=[p20_id])
dnf_id: Mapped[str] = mapped_column(ForeignKey("driver.name"))
dnf: Mapped["Driver"] = relationship("Driver", foreign_keys=[dnf_id]) # Only store first DNF
@ -140,6 +76,11 @@ class User(db.Model):
name: Mapped[str] = mapped_column(String(32), primary_key=True)
# Per race guesses: PX, DNF
# Per season guesses: Hot, P2 Constructor, Most overtakes, Most DNFs, Team winner,
# At least 1 podium
# This table contains guesses made by users
class Guess(db.Model):
__tablename__ = "guess"
@ -154,15 +95,18 @@ class Guess(db.Model):
return self
id: Mapped[int] = mapped_column(Integer, primary_key=True)
user_id: Mapped[str] = mapped_column(ForeignKey("user.name"))
race_id: Mapped[str] = mapped_column(ForeignKey("race.id"))
p10_id: Mapped[str] = mapped_column(ForeignKey("driver.name"))
dnf_id: Mapped[str] = mapped_column(ForeignKey("driver.name"))
raceresult_id: Mapped[int] = mapped_column(ForeignKey("raceresult.id"))
user_id: Mapped[str] = mapped_column(ForeignKey("user.name"))
user: Mapped["User"] = relationship("User", foreign_keys=[user_id])
race_id: Mapped[str] = mapped_column(ForeignKey("race.id"))
race: Mapped["Race"] = relationship("Race", foreign_keys=[race_id])
p10_id: Mapped[str] = mapped_column(ForeignKey("driver.name"))
p10: Mapped["Driver"] = relationship("Driver", foreign_keys=[p10_id])
dnf_id: Mapped[str] = mapped_column(ForeignKey("driver.name"))
dnf: Mapped["Driver"] = relationship("Driver", foreign_keys=[dnf_id])
raceresult_id: Mapped[int] = mapped_column(ForeignKey("raceresult.id"))
raceresult: Mapped["RaceResult"] = relationship("RaceResult", foreign_keys=[raceresult_id])

View File

@ -39,7 +39,7 @@
{% for raceresult in raceresults %}
<tr>
<td>{{ raceresult.race.number }}</td>
<td>{{ raceresult.race.grandprix.name }}</td>
<td>{{ raceresult.race.grandprix }}</td>
{% for user in users %}
{% set p10 = guesses.get(raceresult.race_id).get(user.name).p10.name %}