Skip to content

Commit 7888fdf

Browse files
committed
feat(database): Add persistent data management using sqlite & sqlalchemy
1 parent 3562ef7 commit 7888fdf

File tree

5 files changed

+61
-1
lines changed

5 files changed

+61
-1
lines changed

requirements.in

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,4 @@ fastjsonschema==2.16.2
88
Flask[async]==3.0.3
99
Flask-Cors==6.0.1
1010
werkzeug==3.0.3
11+
sqlalchemy==2.0.43

requirements.txt

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
# This file is autogenerated by pip-compile with Python 3.12
33
# by the following command:
44
#
5-
# pip-compile --pre requirements.in
5+
# pip-compile requirements.in
66
#
77
asgiref==3.9.1
88
# via flask
@@ -23,6 +23,8 @@ geode-common==33.9.0
2323
# via geode-viewables
2424
geode-viewables==3.2.0
2525
# via -r requirements.in
26+
greenlet==3.2.4
27+
# via sqlalchemy
2628
itsdangerous==2.2.0
2729
# via flask
2830
jinja2==3.1.6
@@ -54,6 +56,10 @@ opengeode-io==7.3.2
5456
# -r requirements.in
5557
# geode-viewables
5658
# opengeode-geosciencesio
59+
sqlalchemy==2.0.43
60+
# via -r requirements.in
61+
typing-extensions==4.15.0
62+
# via sqlalchemy
5763
werkzeug==3.0.3
5864
# via
5965
# -r requirements.in

src/opengeodeweb_back/database.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
from sqlalchemy import create_engine
2+
from sqlalchemy.orm import sessionmaker
3+
4+
def get_engine(db_path: str):
5+
return create_engine(f"sqlite:///{db_path}", echo=False)
6+
7+
def get_session(engine):
8+
Session = sessionmaker(bind=engine)
9+
return Session()

src/opengeodeweb_back/models.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import uuid
2+
from datetime import datetime
3+
from sqlalchemy import Column, String, DateTime, JSON
4+
from sqlalchemy.orm import declarative_base
5+
6+
Base = declarative_base()
7+
8+
9+
def generate_uuid():
10+
return str(uuid.uuid4())
11+
12+
13+
class Data(Base):
14+
__tablename__ = "datas"
15+
16+
id = Column(String, primary_key=True, default=generate_uuid)
17+
name = Column(String, nullable=False)
18+
native_file_name = Column(String, nullable=False)
19+
viewable_file_name = Column(String, nullable=False)
20+
geode_object = Column(String, nullable=False)
21+
binary_light_viewable = Column(String, nullable=True)
22+
input_files = Column(JSON, nullable=True)
23+
created_at = Column(DateTime, default=datetime.utcnow)

src/opengeodeweb_back/utils_functions.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414

1515
# Local application imports
1616
from . import geode_functions
17+
from .models import Data, Base
18+
from .database import get_engine, get_session
1719

1820

1921
def increment_request_counter(current_app):
@@ -171,6 +173,25 @@ def save_all_viewables_and_return_info(
171173
with open(saved_light_viewable_file_path, "rb") as f:
172174
binary_light_viewable = f.read()
173175

176+
project_root_path = os.path.dirname(data_path)
177+
engine = get_engine(os.path.join(project_root_path, "db.sqlite3"))
178+
179+
Base.metadata.create_all(engine)
180+
session = get_session(engine)
181+
182+
data_entry = Data(
183+
id=generated_id,
184+
name=data.name(),
185+
native_file_name=os.path.basename(saved_native_file_path[0]),
186+
viewable_file_name=os.path.basename(saved_viewable_file_path),
187+
geode_object=geode_object,
188+
binary_light_viewable=binary_light_viewable.decode("utf-8"),
189+
input_files=additional_files or [],
190+
)
191+
session.add(data_entry)
192+
session.commit()
193+
session.close()
194+
174195
return {
175196
"name": data.name(),
176197
"native_file_name": os.path.basename(saved_native_file_path[0]),

0 commit comments

Comments
 (0)