Skip to content
Merged
180 changes: 88 additions & 92 deletions src/app/create_database.py
Original file line number Diff line number Diff line change
@@ -1,92 +1,88 @@
import csv
from pathlib import Path

from sqlmodel import Session, select
from sqlalchemy.exc import IntegrityError

from src.app.database import create_db_and_tables, engine
from src.app.models.dqm1.item import Item
from src.app.models.dqm1.monster import (
MonsterBreedingLink,
MonsterDetail,
MonsterFamily,
MonsterSkillLink,
)
from src.app.models.dqm1.skill import Skill, SkillCombine


current_dir = Path(__file__).resolve().parent
csv_dir = current_dir.parent / "csv_files"


def _insert_data(csv_file, Model):
"""
helper function that uses dictionary unpacking to add csv file data
into database
"""
with Session(engine) as session:
with open(csv_file, encoding="utf-8-sig") as f:
reader = csv.DictReader(f)
for row in reader:
# replace empty string with None
row = {k: (None if v == "" else v) for k, v in row.items()}
if "id" in row:
existing_entry = session.exec(
select(Model).where(Model.id == row["id"])
).first()

if existing_entry:
print(
f"Entry with id {row['id']} already exists. Skipping insertion."
)
continue
try:
session.add(Model(**row))
except IntegrityError as e:
session.rollback()
print(f"IntegrityError has occurred: {e.orig}")

session.commit()


def create_item_csv():
_insert_data(csv_dir / "DQM1_items.csv", Item)


def create_monster_family_csv():
_insert_data(csv_dir / "DQM1_monster_family.csv", MonsterFamily)


def create_skill_csv():
_insert_data(csv_dir / "DQM1_skills.csv", Skill)


def create_skillcombo_csv():
_insert_data(csv_dir / "DQM1_skill_combo.csv", SkillCombine)


def create_monster_detail_csv():
_insert_data(csv_dir / "DQM1_monsterdetails.csv", MonsterDetail)


def create_breed_combo():
_insert_data(csv_dir / "DQM1_breeding_combo.csv", MonsterBreedingLink)


def create_monster_skill_link():
_insert_data(csv_dir / "DQM1_monster_skill_link.csv", MonsterSkillLink)


def load_all_csv_data():
create_db_and_tables()
create_item_csv()
create_monster_family_csv()
create_skill_csv()
create_skillcombo_csv()
create_monster_detail_csv()
create_breed_combo()
create_monster_skill_link()


if __name__ == "__main__":
load_all_csv_data()
import csv
from pathlib import Path

from sqlalchemy.exc import IntegrityError
from sqlmodel import Session, select

from src.app.database import create_db_and_tables, engine
from src.app.models.dqm1.associations import MonsterSkillLink
from src.app.models.dqm1.item import Item
from src.app.models.dqm1.monster import MonsterBreedingLink, MonsterDetail
from src.app.models.dqm1.monster_family import MonsterFamily
from src.app.models.dqm1.skill import Skill, SkillCombine

current_dir = Path(__file__).resolve().parent
csv_dir = current_dir.parent / "csv_files"


def _insert_data(csv_file, Model):
"""
helper function that uses dictionary unpacking to add csv file data
into database
"""
with Session(engine) as session:
with open(csv_file, encoding="utf-8-sig") as f:
reader = csv.DictReader(f)
for row in reader:
# replace empty string with None
row = {k: (None if v == "" else v) for k, v in row.items()}
if "id" in row:
existing_entry = session.exec(
select(Model).where(Model.id == row["id"])
).first()

if existing_entry:
print(
f"Entry with id {row['id']} already exists. Skipping insertion."
)
continue
try:
session.add(Model(**row))
except IntegrityError as e:
session.rollback()
print(f"IntegrityError has occurred: {e.orig}")

session.commit()


def create_item_csv():
_insert_data(csv_dir / "DQM1_items.csv", Item)


def create_monster_family_csv():
_insert_data(csv_dir / "DQM1_monster_family.csv", MonsterFamily)


def create_skill_csv():
_insert_data(csv_dir / "DQM1_skills.csv", Skill)


def create_skillcombo_csv():
_insert_data(csv_dir / "DQM1_skill_combo.csv", SkillCombine)


def create_monster_detail_csv():
_insert_data(csv_dir / "DQM1_monsterdetails.csv", MonsterDetail)


def create_breed_combo():
_insert_data(csv_dir / "DQM1_breeding_combo.csv", MonsterBreedingLink)


def create_monster_skill_link():
_insert_data(csv_dir / "DQM1_monster_skill_link.csv", MonsterSkillLink)


def load_all_csv_data():
create_db_and_tables()
create_item_csv()
create_monster_family_csv()
create_skill_csv()
create_skillcombo_csv()
create_monster_detail_csv()
create_breed_combo()
create_monster_skill_link()


if __name__ == "__main__":
load_all_csv_data()
19 changes: 19 additions & 0 deletions src/app/models/dqm1/associations.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
from typing import Optional

from sqlmodel import Field, SQLModel


class MonsterSkillLink(SQLModel, table=True):
"""
many-to-many association table linking a monster to three different skills.
"""

id: Optional[int] = Field(default=None, primary_key=True)
monster_id: Optional[int] = Field(
default=None,
foreign_key="monsterdetail.id",
)
skill_id: Optional[int] = Field(
default=None,
foreign_key="skill.id",
)
Loading