Skip to content

Commit 0865c9a

Browse files
committed
Add db module to support sqlite #89
- Update Paths model to have optional repository_names
1 parent 0922275 commit 0865c9a

File tree

2 files changed

+83
-0
lines changed

2 files changed

+83
-0
lines changed

github_stats_pages/db.py

+82
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
from functools import partial
2+
from pathlib import Path
3+
from typing import Union, Type
4+
5+
import pandas as pd
6+
from sqlalchemy.future import Engine
7+
from sqlalchemy.exc import NoResultFound
8+
from sqlmodel import SQLModel, Session, create_engine, select
9+
10+
from .models import Clone, Referring, Traffic, Paths
11+
from .logger import app_log as log
12+
13+
SQLITE_FILE_NAME = "data/sqlite3.db"
14+
15+
16+
def configure(test: bool = False, echo: bool = False) -> Engine:
17+
sqlite_file_name = "test_data/sqlite3.db" if test else SQLITE_FILE_NAME
18+
sqlite_url = f"sqlite:///{sqlite_file_name}"
19+
return create_engine(sqlite_url, echo=echo)
20+
21+
22+
def create_db_and_tables(test: bool = False):
23+
engine = configure(test=test, echo=True)
24+
SQLModel.metadata.create_all(engine)
25+
return engine
26+
27+
28+
def migrate_csv(
29+
filename: Union[str, Path],
30+
model: Type[SQLModel],
31+
engine: Engine,
32+
skip_rows: Union[int, None] = None,
33+
):
34+
"""Migrate CSV over to SQLite"""
35+
36+
names = list(
37+
map(
38+
lambda f: f.name,
39+
filter(lambda x: x.required, model.__fields__.values()),
40+
)
41+
)
42+
log.info(f"[yellow]Loading: {filename}")
43+
df = pd.read_csv(filename, header=None, skiprows=skip_rows, names=names)
44+
if isinstance(model, Paths):
45+
repository_names = [a.split("/")[2] for a in df["path"].values]
46+
df.insert(1, "repository_name", repository_names)
47+
48+
func = partial(query, engine=engine, model=model)
49+
50+
query_results = list(map(func, df["repository_name"], df["date"]))
51+
new_df: pd.DataFrame = df.iloc[
52+
[idx for idx, item in enumerate(query_results) if not item]
53+
]
54+
if new_df.empty:
55+
log.info("No new records!")
56+
else:
57+
log.info(f"New records found: {len(new_df)}")
58+
log.info("[bold yellow]Adding data")
59+
new_df.to_sql(
60+
model.__name__.lower(), engine, if_exists="append", index=False
61+
)
62+
if len(new_df) < len(df):
63+
log.info("[orange]Some records exists in db")
64+
65+
66+
def query(
67+
repository_name: str,
68+
date: str,
69+
engine: Engine,
70+
model: Union[Type[SQLModel], Clone, Referring, Paths, Traffic],
71+
) -> Union[SQLModel, Clone, Referring, Paths, Traffic, None]:
72+
73+
with Session(engine) as session:
74+
result = session.exec(
75+
select(model).where(
76+
model.repository_name == repository_name, model.date == date
77+
)
78+
)
79+
try:
80+
return result.one()
81+
except NoResultFound:
82+
return

github_stats_pages/models/paths.py

+1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
class Paths(SQLModel, table=True):
77
id: Optional[int] = Field(default=None, primary_key=True)
88
date: str
9+
repository_name: Optional[str]
910
path: str
1011
title: str
1112
views: int

0 commit comments

Comments
 (0)