Skip to content

Commit b8e800d

Browse files
committed
Create a DatabaseConnection class
1 parent 099622c commit b8e800d

File tree

4 files changed

+105
-118
lines changed

4 files changed

+105
-118
lines changed

app/config/database.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,4 @@
1111
if PRODUCTION:
1212
DATABASE_PATH = 'data/lafs.db'
1313
else:
14-
DATABASE_PATH = 'data/lafscms.db'
14+
DATABASE_PATH = 'data/lafs.db'

app/crud/crud_main.py

Lines changed: 75 additions & 117 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22
import sqlite3
33
from typing import Dict, Any, List
44

5+
# Local
6+
from helpers import DatabaseConnection
7+
58

69

710

@@ -21,19 +24,11 @@ def get_id_current_series(db: str) -> int:
2124
Returns:
2225
int: ID of the current film series.
2326
"""
24-
# Create connection and cursor
25-
connection = sqlite3.connect(db, check_same_thread=False)
26-
connection.row_factory = sqlite3.Row
27-
cursor = connection.cursor()
28-
29-
# Query db
30-
query = "SELECT series_id FROM series ORDER BY series_id DESC LIMIT 1;"
31-
cursor.execute(query)
32-
current_series_id = cursor.fetchone()
33-
34-
# Close cursor and connection
35-
cursor.close()
36-
connection.close()
27+
with DatabaseConnection(db) as cursor:
28+
query = "SELECT series_id FROM series ORDER BY series_id DESC LIMIT 1;"
29+
cursor.execute(query)
30+
31+
current_series_id = cursor.fetchone()
3732

3833
return current_series_id
3934

@@ -49,39 +44,31 @@ def get_info_series(db: str, series_id: int) -> Dict[str, Any]:
4944
Returns:
5045
Dict[str, Any]: Information about the series.
5146
"""
52-
# Create connection and cursor
53-
connection = sqlite3.connect(db, check_same_thread=False)
54-
connection.row_factory = sqlite3.Row
55-
cursor = connection.cursor()
56-
57-
# Query db
58-
query = "SELECT s.series_id, "
59-
query = query + "series_semester || series_year AS semester, "
60-
query = query + "series_semester, "
61-
query = query + "series_year, "
62-
query = query + "series_title, "
63-
query = query + "series_brief, "
64-
query = query + "series_poster, "
65-
query = query + "series_poster_url, "
66-
query = query + "series_display, "
67-
query = query + "color1, "
68-
query = query + "color2, "
69-
query = query + "color3 "
70-
query = query + "FROM series s "
71-
query = query + "JOIN colors AS c ON s.series_id = c.series_id "
72-
query = query + "WHERE s.series_id = ?; "
73-
cursor.execute(query, (series_id,))
74-
results = cursor.fetchone()
47+
with DatabaseConnection(db) as cursor:
48+
query = "SELECT s.series_id, "
49+
query = query + "series_semester || series_year AS semester, "
50+
query = query + "series_semester, "
51+
query = query + "series_year, "
52+
query = query + "series_title, "
53+
query = query + "series_brief, "
54+
query = query + "series_poster, "
55+
query = query + "series_poster_url, "
56+
query = query + "series_display, "
57+
query = query + "color1, "
58+
query = query + "color2, "
59+
query = query + "color3 "
60+
query = query + "FROM series s "
61+
query = query + "JOIN colors AS c ON s.series_id = c.series_id "
62+
query = query + "WHERE s.series_id = ?; "
63+
cursor.execute(query, (series_id,))
64+
65+
results = cursor.fetchone()
7566

7667
# Construct the full URL for the series poster
7768
results = dict(results)
7869
if results['series_poster_url']:
7970
results['series_poster_url'] = f"{{ url_for('main_bp.static', filename=f'images/{results['series_poster_url']}') }}"
8071

81-
# Close cursor and connection
82-
cursor.close()
83-
connection.close()
84-
8572
return results
8673

8774

@@ -96,35 +83,26 @@ def get_info_schedules(db: str, series_id: int) -> List[Dict[str, Any]]:
9683
Returns:
9784
List[Dict[str, Any]]: A list of dictionaries containing schedule information.
9885
"""
99-
# Create connection and cursor
100-
connection = sqlite3.connect(db, check_same_thread=False)
101-
connection.row_factory = sqlite3.Row
102-
cursor = connection.cursor()
103-
104-
# Query db
105-
query = "SELECT strftime('%d', schedule) AS day, "
106-
query = query + "f.id, "
107-
query = query + "rtrim (substr ('January February March April May June July August SeptemberOctober November December', strftime ('%m', schedule) * 9 - 8, 9)) AS month, "
108-
query = query + "film_title, film_director, film_year, film_runtime, wiki, sc.schedule, sc.notes "
109-
query = query + "FROM series AS se "
110-
query = query + "JOIN schedules AS sc ON se.series_id = sc.series_id "
111-
query = query + "JOIN films AS f ON sc.film_id = f.id "
112-
query = query + "WHERE se.series_id = ?; "
113-
cursor.execute(query, (series_id,))
114-
115-
# Get rows
116-
rows = cursor.fetchall()
117-
118-
# Get the column names from cursor.description
119-
columns = [column[0] for column in cursor.description]
86+
with DatabaseConnection(db) as cursor:
87+
query = "SELECT strftime('%d', schedule) AS day, "
88+
query = query + "f.id, "
89+
query = query + "rtrim (substr ('January February March April May June July August SeptemberOctober November December', strftime ('%m', schedule) * 9 - 8, 9)) AS month, "
90+
query = query + "film_title, film_director, film_year, film_runtime, wiki, sc.schedule, sc.notes "
91+
query = query + "FROM series AS se "
92+
query = query + "JOIN schedules AS sc ON se.series_id = sc.series_id "
93+
query = query + "JOIN films AS f ON sc.film_id = f.id "
94+
query = query + "WHERE se.series_id = ?; "
95+
cursor.execute(query, (series_id,))
96+
97+
# Get rows
98+
rows = cursor.fetchall()
99+
100+
# Get the column names from cursor.description
101+
columns = [column[0] for column in cursor.description]
120102

121103
# Convert each row into a dictionary using zip
122104
result = [dict(zip(columns, row)) for row in rows]
123105

124-
# Close cursor and connection
125-
cursor.close()
126-
connection.close()
127-
128106
return result
129107

130108

@@ -138,20 +116,15 @@ def get_info_series_ids(db: str) -> List[Dict[str, Any]]:
138116
Returns:
139117
List[Dict[str, Any]]: A list of dictionaries containing series ID information.
140118
"""
141-
# Create connection and cursor
142-
connection = sqlite3.connect(db, check_same_thread=False)
143-
connection.row_factory = sqlite3.Row
144-
cursor = connection.cursor()
145-
146-
# Query db
147-
query = "SELECT DISTINCT(series_id), series_semester, series_year, series_display FROM series; "
148-
cursor.execute(query)
119+
with DatabaseConnection(db) as cursor:
120+
query = "SELECT DISTINCT(series_id), series_semester, series_year, series_display FROM series; "
121+
cursor.execute(query)
149122

150-
# Get rows
151-
rows = cursor.fetchall()
123+
# Get rows
124+
rows = cursor.fetchall()
152125

153-
# Get the column names from cursor.description
154-
columns = [column[0] for column in cursor.description]
126+
# Get the column names from cursor.description
127+
columns = [column[0] for column in cursor.description]
155128

156129
# Convert each row into a dictionary using zip
157130
result = [dict(zip(columns, row)) for row in rows]
@@ -169,24 +142,19 @@ def get_info_serieses(db: str) -> List[Dict[str, Any]]:
169142
Returns:
170143
List[Dict[str, Any]]: A list of dictionaries containing series ID information.
171144
"""
172-
# Create connection and cursor
173-
connection = sqlite3.connect(db, check_same_thread=False)
174-
connection.row_factory = sqlite3.Row
175-
cursor = connection.cursor()
145+
with DatabaseConnection(db) as cursor:
146+
query = "SELECT DISTINCT(series_id), "
147+
query = query + "series_semester, "
148+
query = query + "series_year, "
149+
query = query + "series_display "
150+
query = query + "FROM series; "
151+
cursor.execute(query)
176152

177-
# Query db
178-
query = "SELECT DISTINCT(series_id), "
179-
query = query + "series_semester, "
180-
query = query + "series_year, "
181-
query = query + "series_display "
182-
query = query + "FROM series; "
183-
cursor.execute(query)
153+
# Get rows
154+
rows = cursor.fetchall()
184155

185-
# Get rows
186-
rows = cursor.fetchall()
187-
188-
# Get the column names from cursor.description
189-
columns = [column[0] for column in cursor.description]
156+
# Get the column names from cursor.description
157+
columns = [column[0] for column in cursor.description]
190158

191159
# Convert each row into a dictionary using zip
192160
result = [dict(zip(columns, row)) for row in rows]
@@ -205,19 +173,14 @@ def get_info_film(db: str, film_id: int) -> Dict[str, Any]:
205173
Returns:
206174
Dict[str, Any]: Information about the film.
207175
"""
208-
# Create connection and cursor
209-
connection = sqlite3.connect(db, check_same_thread=False)
210-
connection.row_factory = sqlite3.Row
211-
cursor = connection.cursor()
212-
213-
# Query db
214-
query = "SELECT * "
215-
query = query + "FROM films "
216-
query = query + "WHERE id = ?; "
217-
cursor.execute(query, (film_id,))
176+
with DatabaseConnection(db) as cursor:
177+
query = "SELECT * "
178+
query = query + "FROM films "
179+
query = query + "WHERE id = ?; "
180+
cursor.execute(query, (film_id,))
218181

219-
# Get row
220-
row = cursor.fetchone()
182+
# Get row
183+
row = cursor.fetchone()
221184

222185
# Convert row into a dictionary
223186
result = dict(row)
@@ -227,18 +190,13 @@ def get_info_film(db: str, film_id: int) -> Dict[str, Any]:
227190

228191
def get_info_series_status(db, series_id):
229192

230-
# Create connection and cursor
231-
connection = sqlite3.connect(db, check_same_thread=False)
232-
connection.row_factory = sqlite3.Row
233-
cursor = connection.cursor()
234-
235-
query = "SELECT "
236-
query = query + "max(date(substr(schedule, 1, 4) || '-' || substr(schedule, 6, 2) || '-' || substr(schedule, 9, 2))) < current_timestamp AS status "
237-
query = query + "FROM schedules WHERE series_id = ?; "
238-
cursor.execute(query, series_id)
193+
with DatabaseConnection(db) as cursor:
239194

240-
series_status = cursor.fetchone()
195+
query = "SELECT "
196+
query = query + "max(date(substr(schedule, 1, 4) || '-' || substr(schedule, 6, 2) || '-' || substr(schedule, 9, 2))) < current_timestamp AS status "
197+
query = query + "FROM schedules WHERE series_id = ?; "
198+
cursor.execute(query, series_id)
241199

242-
connection.close()
200+
series_status = cursor.fetchone()
243201

244-
return(series_status)
202+
return series_status

app/helpers/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
# Local Libraries
77
import crud
8+
from .helpers_database import *
89
from .helpers_dicts import *
910
from .helpers_main import *
1011

app/helpers/helpers_database.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
# Python Standard Library
2+
import sqlite3
3+
4+
5+
6+
7+
8+
9+
10+
11+
12+
13+
class DatabaseConnection:
14+
def __init__(self, db_path):
15+
self.db_path = db_path
16+
17+
def __enter__(self):
18+
self.connection = sqlite3.connect(self.db_path, check_same_thread=False)
19+
self.connection.row_factory = sqlite3.Row
20+
self.cursor = self.connection.cursor()
21+
return self.cursor
22+
23+
def __exit__(self, exception_type, exception_value, exception_traceback):
24+
if self.cursor:
25+
self.cursor.close()
26+
if self.connection:
27+
self.connection.commit()
28+
self.connection.close()

0 commit comments

Comments
 (0)