From 54d1c97cf6b1bd26a2df26aa233dd890f7646108 Mon Sep 17 00:00:00 2001 From: MaxNumerique Date: Mon, 15 Sep 2025 16:11:17 +0200 Subject: [PATCH 01/20] renamed var database & cleaned imports and README --- README.md | 2 +- src/opengeodeweb_microservice/database/base.py | 2 -- .../database/connection.py | 18 +++++++++--------- 3 files changed, 10 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 5bde620..d9b4d1e 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -

OpenGeodeWeb-Backby Geode-solutions

+

OpenGeodeWeb-Microserviceby Geode-solutions

OpenSource Python framework based on OpenGeode

diff --git a/src/opengeodeweb_microservice/database/base.py b/src/opengeodeweb_microservice/database/base.py index 8bb12e6..fa2b68a 100644 --- a/src/opengeodeweb_microservice/database/base.py +++ b/src/opengeodeweb_microservice/database/base.py @@ -1,5 +1,3 @@ -from flask import Flask -from flask_sqlalchemy import SQLAlchemy from sqlalchemy.orm import DeclarativeBase diff --git a/src/opengeodeweb_microservice/database/connection.py b/src/opengeodeweb_microservice/database/connection.py index 0d76762..ac5ba6f 100644 --- a/src/opengeodeweb_microservice/database/connection.py +++ b/src/opengeodeweb_microservice/database/connection.py @@ -8,22 +8,22 @@ from .base import Base DATABASE_FILENAME = "project.db" -db: Optional[SQLAlchemy] = None +database: Optional[SQLAlchemy] = None def init_database(app: Flask, db_filename: str = DATABASE_FILENAME) -> SQLAlchemy: - global db - if db is None: - db = SQLAlchemy(model_class=Base) - db.init_app(app) + global database + if database is None: + database = SQLAlchemy(model_class=Base) + database.init_app(app) with app.app_context(): - db.create_all() - return db + database.create_all() + return database def get_database() -> Optional[SQLAlchemy]: - return db + return database def get_session() -> Optional[scoped_session[Session]]: - return db.session if db else None + return database.session if database else None From 827284c165f03ada8f6113887253ba1bd1707e78 Mon Sep 17 00:00:00 2001 From: MaxNumerique Date: Thu, 18 Sep 2025 17:07:49 +0200 Subject: [PATCH 02/20] sql alchemy replacing flask sql alchemy --- pyproject.toml | 2 +- requirements.txt | 1 - .../database/connection.py | 36 ++++++------- .../database/data.py | 15 +++--- tests/conftest.py | 54 +++++++------------ tests/test_connection.py | 9 ---- tests/test_database.py | 12 ++--- 7 files changed, 49 insertions(+), 80 deletions(-) delete mode 100644 tests/test_connection.py diff --git a/pyproject.toml b/pyproject.toml index 2059899..2fd4da1 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "OpenGeodeWeb-Microservice" -version = "0.0.0" +version = "1.0.0" dynamic = ["dependencies"] authors = [{ name = "Geode-solutions", email = "team-web@geode-solutions.com" }] description = "Database model and ORM layer for OpenGeodeWeb ecosystem" diff --git a/requirements.txt b/requirements.txt index e04ccbd..1ce80f5 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,2 @@ SQLAlchemy==2.0.43 -Flask-SQLAlchemy==3.1.1 fastjsonschema==2.21.1 \ No newline at end of file diff --git a/src/opengeodeweb_microservice/database/connection.py b/src/opengeodeweb_microservice/database/connection.py index ac5ba6f..5fceb72 100644 --- a/src/opengeodeweb_microservice/database/connection.py +++ b/src/opengeodeweb_microservice/database/connection.py @@ -1,29 +1,29 @@ """Database connection management""" -from typing import Optional -from sqlalchemy.orm import scoped_session -from flask import Flask -from flask_sqlalchemy import SQLAlchemy -from flask_sqlalchemy.session import Session +from sqlalchemy import create_engine +from sqlalchemy.orm import sessionmaker, scoped_session from .base import Base DATABASE_FILENAME = "project.db" -database: Optional[SQLAlchemy] = None +engine = None +session_factory = None +scoped_session_registry = None -def init_database(app: Flask, db_filename: str = DATABASE_FILENAME) -> SQLAlchemy: - global database - if database is None: - database = SQLAlchemy(model_class=Base) - database.init_app(app) - with app.app_context(): - database.create_all() - return database +def init_database(db_path: str = DATABASE_FILENAME) -> None: + global engine, session_factory, scoped_session_registry -def get_database() -> Optional[SQLAlchemy]: - return database + if engine is None: + engine = create_engine( + f"sqlite:///{db_path}", connect_args={"check_same_thread": False} + ) + session_factory = sessionmaker(bind=engine) + scoped_session_registry = scoped_session(session_factory) + Base.metadata.create_all(engine) -def get_session() -> Optional[scoped_session[Session]]: - return database.session if database else None +def get_session(): + if scoped_session_registry is None: + raise RuntimeError() + return scoped_session_registry diff --git a/src/opengeodeweb_microservice/database/data.py b/src/opengeodeweb_microservice/database/data.py index 97555f7..f0be714 100644 --- a/src/opengeodeweb_microservice/database/data.py +++ b/src/opengeodeweb_microservice/database/data.py @@ -25,8 +25,8 @@ def create( input_file: str | None = None, additional_files: list[str] | None = None, ) -> "Data": - input_file = input_file if input_file is not None else "" - additional_files = additional_files if additional_files is not None else [] + input_file = input_file or "" + additional_files = additional_files or [] data_entry = Data( geode_object=geode_object, @@ -38,15 +38,12 @@ def create( ) session = get_session() - if session: - session.add(data_entry) - session.flush() - session.commit() + session.add(data_entry) + session.flush() + session.commit() return data_entry @staticmethod def get(data_id: str) -> "Data | None": session = get_session() - if session: - return session.get(Data, data_id) - return None + return session.get(Data, data_id) diff --git a/tests/conftest.py b/tests/conftest.py index 3852862..eeed146 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,34 +1,26 @@ import os import pytest -from flask import Flask from src.opengeodeweb_microservice.database.connection import init_database, get_session from src.opengeodeweb_microservice.database.data import Data -@pytest.fixture(scope="session") -def app(): - app = Flask(__name__) - app.config.update( - { - "TESTING": True, - "SQLALCHEMY_DATABASE_URI": f"sqlite:///{os.path.join(os.path.dirname(__file__), 'test_project.db')}", - "SQLALCHEMY_TRACK_MODIFICATIONS": False, - } - ) - with app.app_context(): - init_database(app, "test_project.db") - yield app - _cleanup_database() +DB_PATH = os.path.join(os.path.dirname(__file__), "test_project.db") -def _cleanup_database(): +@pytest.fixture(scope="session", autouse=True) +def setup_database(): + init_database(DB_PATH) + yield + _cleanup_database(DB_PATH) + + +def _cleanup_database(db_path: str): try: session = get_session() - if session: - session.close() + session.close() except Exception: pass - db_path = os.path.join(os.path.dirname(__file__), "test_project.db") + if os.path.exists(db_path): try: os.remove(db_path) @@ -36,21 +28,13 @@ def _cleanup_database(): pass -@pytest.fixture -def app_context(app): - with app.app_context(): - yield - - -@pytest.fixture -def clean_database(app_context): +@pytest.fixture(autouse=True) +def clean_database(): session = get_session() - if session: - session.query(Data).delete() - session.commit() + session.query(Data).delete() + session.commit() yield - if session: - try: - session.rollback() - except Exception: - pass + try: + session.rollback() + except Exception: + pass diff --git a/tests/test_connection.py b/tests/test_connection.py deleted file mode 100644 index fe3748e..0000000 --- a/tests/test_connection.py +++ /dev/null @@ -1,9 +0,0 @@ -from src.opengeodeweb_microservice.database.connection import get_session, get_database -from src.opengeodeweb_microservice.database.data import Data - - -def test_database_connection_basic(app_context): - session = get_session() - assert session is not None - connection = get_database() - assert connection is not None diff --git a/tests/test_database.py b/tests/test_database.py index 8c7974b..2036d08 100644 --- a/tests/test_database.py +++ b/tests/test_database.py @@ -1,12 +1,10 @@ -from src.opengeodeweb_microservice.database.connection import get_session from src.opengeodeweb_microservice.database.data import Data -def test_data_crud_operations(): +def test_data_crud_operations(clean_database): data = Data.create(geode_object="test_object", input_file="test.txt") assert data.id is not None - session = get_session() - session.commit() + retrieved = Data.get(data.id) assert retrieved is not None assert retrieved.geode_object == "test_object" @@ -14,10 +12,10 @@ def test_data_crud_operations(): assert non_existent is None -def test_data_with_additional_files(): +def test_data_with_additional_files(clean_database): files = ["file1.txt", "file2.txt"] data = Data.create(geode_object="test_files", additional_files=files) - session = get_session() - session.commit() + retrieved = Data.get(data.id) + assert retrieved is not None assert retrieved.additional_files == files From 167d5de94b496898bcdccc26852369616a0cb5fe Mon Sep 17 00:00:00 2001 From: MaxNumerique Date: Fri, 19 Sep 2025 09:15:16 +0200 Subject: [PATCH 03/20] pyproject version 0.0.0 --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 2fd4da1..2059899 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "OpenGeodeWeb-Microservice" -version = "1.0.0" +version = "0.0.0" dynamic = ["dependencies"] authors = [{ name = "Geode-solutions", email = "team-web@geode-solutions.com" }] description = "Database model and ORM layer for OpenGeodeWeb ecosystem" From b66eb6313cf3957e1e2f73bd097c8b6bdc82c2b9 Mon Sep 17 00:00:00 2001 From: MaxNumerique Date: Fri, 19 Sep 2025 09:16:55 +0200 Subject: [PATCH 04/20] fix(database): using SQL Alchemy instead of Flask-SQLAlchemy From 9ee333b971fccaa9b695d2a9e34cd7f90dc19d94 Mon Sep 17 00:00:00 2001 From: MaxNumerique Date: Tue, 30 Sep 2025 16:05:20 +0200 Subject: [PATCH 05/20] test to insure that we do have the required paramaters to add dataa to database --- tests/test_database.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/tests/test_database.py b/tests/test_database.py index 2036d08..962cc10 100644 --- a/tests/test_database.py +++ b/tests/test_database.py @@ -2,12 +2,19 @@ def test_data_crud_operations(clean_database): - data = Data.create(geode_object="test_object", input_file="test.txt") + data = Data.create( + geode_object="test_object", input_file="test.txt", additional_files=[] + ) + print("id", data.id, flush=True) assert data.id is not None + assert isinstance(data.id, str) retrieved = Data.get(data.id) assert retrieved is not None + assert isinstance(retrieved, Data) assert retrieved.geode_object == "test_object" + assert retrieved.input_file == "test.txt" + assert retrieved.id == data.id non_existent = Data.get("fake_id") assert non_existent is None @@ -15,7 +22,11 @@ def test_data_crud_operations(clean_database): def test_data_with_additional_files(clean_database): files = ["file1.txt", "file2.txt"] data = Data.create(geode_object="test_files", additional_files=files) + assert data.id is not None + assert isinstance(data.id, str) retrieved = Data.get(data.id) assert retrieved is not None + assert isinstance(retrieved, Data) assert retrieved.additional_files == files + assert retrieved.geode_object == "test_files" From 90a7d363160da4d4015d12dc824e258d409a9996 Mon Sep 17 00:00:00 2001 From: MaxNumerique <144453705+MaxNumerique@users.noreply.github.com> Date: Wed, 1 Oct 2025 08:36:07 +0000 Subject: [PATCH 06/20] Apply prepare changes --- mypy.ini | 3 ++- requirements.txt | 29 +++++++++++++++++++---------- 2 files changed, 21 insertions(+), 11 deletions(-) diff --git a/mypy.ini b/mypy.ini index 8240312..089c049 100644 --- a/mypy.ini +++ b/mypy.ini @@ -1,3 +1,4 @@ [mypy] strict = True -files = src/ \ No newline at end of file +files = src/ +disallow_untyped_decorators = False \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index 71a2422..a387959 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,26 +1,35 @@ -SQLAlchemy==2.0.43 +# +# This file is autogenerated by pip-compile with Python 3.12 +# by the following command: +# +# pip-compile --output-file=./requirements.txt --pre ./requirements.in +# +blinker==1.*,>=1.9.0 + # via flask +click==8.*,>=8.3.0 + # via flask fastjsonschema==2.21.1 # via -r requirements.in -flask==3.1.2 +flask==3.*,>=3.1.2 # via flask-sqlalchemy -flask-sqlalchemy==3.1.1 +flask-sqlalchemy==3.*,>=3.1.1 # via -r requirements.in -greenlet==3.2.4 +greenlet==3.*,>=3.2.4 # via sqlalchemy -itsdangerous==2.2.0 +itsdangerous==2.*,>=2.2.0 # via flask -jinja2==3.1.6 +jinja2==3.*,>=3.1.6 # via flask -markupsafe==3.0.2 +markupsafe==3.*,>=3.0.3 # via # flask # jinja2 # werkzeug -sqlalchemy==2.0.43 +sqlalchemy==2.*,>=2.0.43 # via # -r requirements.in # flask-sqlalchemy -typing-extensions==4.15.0 +typing-extensions==4.*,>=4.15.0 # via sqlalchemy -werkzeug==3.1.3 +werkzeug==3.*,>=3.1.3 # via flask From 920cdfab6877bede86bd097b04b960702b7a1d2a Mon Sep 17 00:00:00 2001 From: MaxNumerique Date: Wed, 1 Oct 2025 11:15:13 +0200 Subject: [PATCH 07/20] mypy type --- src/opengeodeweb_microservice/database/connection.py | 2 +- src/opengeodeweb_microservice/database/data.py | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/opengeodeweb_microservice/database/connection.py b/src/opengeodeweb_microservice/database/connection.py index 5fceb72..b4e9f20 100644 --- a/src/opengeodeweb_microservice/database/connection.py +++ b/src/opengeodeweb_microservice/database/connection.py @@ -23,7 +23,7 @@ def init_database(db_path: str = DATABASE_FILENAME) -> None: Base.metadata.create_all(engine) -def get_session(): +def get_session() -> scoped_session: if scoped_session_registry is None: raise RuntimeError() return scoped_session_registry diff --git a/src/opengeodeweb_microservice/database/data.py b/src/opengeodeweb_microservice/database/data.py index f0be714..22309ef 100644 --- a/src/opengeodeweb_microservice/database/data.py +++ b/src/opengeodeweb_microservice/database/data.py @@ -3,6 +3,7 @@ from .connection import get_session from .base import Base import uuid +from typing import cast class Data(Base): @@ -46,4 +47,4 @@ def create( @staticmethod def get(data_id: str) -> "Data | None": session = get_session() - return session.get(Data, data_id) + return cast("Data | None", session.get(Data, data_id)) From 631f9d89c412a552104cf1a76bd37348edd05812 Mon Sep 17 00:00:00 2001 From: MaxNumerique Date: Wed, 1 Oct 2025 11:17:29 +0200 Subject: [PATCH 08/20] Session type --- src/opengeodeweb_microservice/database/connection.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/opengeodeweb_microservice/database/connection.py b/src/opengeodeweb_microservice/database/connection.py index b4e9f20..06ef46f 100644 --- a/src/opengeodeweb_microservice/database/connection.py +++ b/src/opengeodeweb_microservice/database/connection.py @@ -1,7 +1,7 @@ """Database connection management""" from sqlalchemy import create_engine -from sqlalchemy.orm import sessionmaker, scoped_session +from sqlalchemy.orm import sessionmaker, scoped_session, Session from .base import Base DATABASE_FILENAME = "project.db" @@ -23,7 +23,7 @@ def init_database(db_path: str = DATABASE_FILENAME) -> None: Base.metadata.create_all(engine) -def get_session() -> scoped_session: +def get_session() -> scoped_session[Session]: if scoped_session_registry is None: raise RuntimeError() return scoped_session_registry From 72c2f1590af57c42ac449c859375d04033d48d00 Mon Sep 17 00:00:00 2001 From: MaxNumerique Date: Wed, 1 Oct 2025 12:14:05 +0200 Subject: [PATCH 09/20] update requirements.in --- requirements.in | 1 - 1 file changed, 1 deletion(-) diff --git a/requirements.in b/requirements.in index e04ccbd..1ce80f5 100644 --- a/requirements.in +++ b/requirements.in @@ -1,3 +1,2 @@ SQLAlchemy==2.0.43 -Flask-SQLAlchemy==3.1.1 fastjsonschema==2.21.1 \ No newline at end of file From f8c5bd1ab76e7e813ba756586c993681fa59007b Mon Sep 17 00:00:00 2001 From: MaxNumerique <144453705+MaxNumerique@users.noreply.github.com> Date: Wed, 1 Oct 2025 10:14:24 +0000 Subject: [PATCH 10/20] Apply prepare changes --- requirements.txt | 23 +---------------------- 1 file changed, 1 insertion(+), 22 deletions(-) diff --git a/requirements.txt b/requirements.txt index a387959..8b87e8c 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,32 +4,11 @@ # # pip-compile --output-file=./requirements.txt --pre ./requirements.in # -blinker==1.*,>=1.9.0 - # via flask -click==8.*,>=8.3.0 - # via flask fastjsonschema==2.21.1 # via -r requirements.in -flask==3.*,>=3.1.2 - # via flask-sqlalchemy -flask-sqlalchemy==3.*,>=3.1.1 - # via -r requirements.in greenlet==3.*,>=3.2.4 # via sqlalchemy -itsdangerous==2.*,>=2.2.0 - # via flask -jinja2==3.*,>=3.1.6 - # via flask -markupsafe==3.*,>=3.0.3 - # via - # flask - # jinja2 - # werkzeug sqlalchemy==2.*,>=2.0.43 - # via - # -r requirements.in - # flask-sqlalchemy + # via -r requirements.in typing-extensions==4.*,>=4.15.0 # via sqlalchemy -werkzeug==3.*,>=3.1.3 - # via flask From d02aa19c1f3c5e53996d069f459c595b3ca1316e Mon Sep 17 00:00:00 2001 From: MaxNumerique <144453705+MaxNumerique@users.noreply.github.com> Date: Thu, 2 Oct 2025 15:04:34 +0000 Subject: [PATCH 11/20] Apply prepare changes --- requirements.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/requirements.txt b/requirements.txt index 8b87e8c..16d435c 100644 --- a/requirements.txt +++ b/requirements.txt @@ -6,9 +6,9 @@ # fastjsonschema==2.21.1 # via -r requirements.in -greenlet==3.*,>=3.2.4 +greenlet~=3.0 # via sqlalchemy -sqlalchemy==2.*,>=2.0.43 +sqlalchemy~=2.0 # via -r requirements.in -typing-extensions==4.*,>=4.15.0 +typing-extensions~=4.0 # via sqlalchemy From 89a9350c7736c83ac6b8106a755377443e2ea692 Mon Sep 17 00:00:00 2001 From: MaxNumerique <144453705+MaxNumerique@users.noreply.github.com> Date: Mon, 6 Oct 2025 12:22:21 +0000 Subject: [PATCH 12/20] Apply prepare changes --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index f8ace26..f1fecc7 100644 --- a/requirements.txt +++ b/requirements.txt @@ -10,5 +10,5 @@ greenlet~=3.2 # via sqlalchemy sqlalchemy~=2.0 # via -r requirements.in -typing-extensions~=4.0 +typing-extensions~=4.15 # via sqlalchemy From f823e4184ab65bcb05dd814ee5f8335915938b5a Mon Sep 17 00:00:00 2001 From: MaxNumerique Date: Tue, 7 Oct 2025 17:12:44 +0200 Subject: [PATCH 13/20] added logs + get_session as session --- .../database/connection.py | 9 +++++++-- tests/conftest.py | 17 +++++++++-------- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/src/opengeodeweb_microservice/database/connection.py b/src/opengeodeweb_microservice/database/connection.py index 06ef46f..3a3b0a9 100644 --- a/src/opengeodeweb_microservice/database/connection.py +++ b/src/opengeodeweb_microservice/database/connection.py @@ -16,14 +16,19 @@ def init_database(db_path: str = DATABASE_FILENAME) -> None: if engine is None: engine = create_engine( - f"sqlite:///{db_path}", connect_args={"check_same_thread": False} + f"sqlite:///{db_path}", + connect_args={"check_same_thread": False}, ) + print(f"Database engine created for {db_path}", flush=True) session_factory = sessionmaker(bind=engine) scoped_session_registry = scoped_session(session_factory) Base.metadata.create_all(engine) + print(f"Database engine created DONE for {db_path}") + else: + print(f"Database engine already exists for {db_path}, reusing", flush=True) def get_session() -> scoped_session[Session]: if scoped_session_registry is None: raise RuntimeError() - return scoped_session_registry + return scoped_session_registry() diff --git a/tests/conftest.py b/tests/conftest.py index eeed146..24c98f3 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -30,11 +30,12 @@ def _cleanup_database(db_path: str): @pytest.fixture(autouse=True) def clean_database(): - session = get_session() - session.query(Data).delete() - session.commit() - yield - try: - session.rollback() - except Exception: - pass + with get_session() as session: + session = get_session() + session.query(Data).delete() + session.commit() + yield + try: + session.rollback() + except Exception: + pass From d1047b407d5b608ec1438e3150b00cc2b6335a33 Mon Sep 17 00:00:00 2001 From: MaxNumerique <144453705+MaxNumerique@users.noreply.github.com> Date: Thu, 9 Oct 2025 07:30:29 +0000 Subject: [PATCH 14/20] Apply prepare changes --- requirements.txt | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/requirements.txt b/requirements.txt index f1fecc7..4dc3710 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,14 +1,2 @@ -# -# This file is autogenerated by pip-compile with Python 3.12 -# by the following command: -# -# pip-compile --output-file=./requirements.txt --pre ./requirements.in -# +SQLAlchemy==2.0.43 fastjsonschema==2.21.1 - # via -r requirements.in -greenlet~=3.2 - # via sqlalchemy -sqlalchemy~=2.0 - # via -r requirements.in -typing-extensions~=4.15 - # via sqlalchemy From 8cd055ca92e829a38d59f8605224b91a6f12f4ac Mon Sep 17 00:00:00 2001 From: MaxNumerique Date: Thu, 9 Oct 2025 10:15:53 +0200 Subject: [PATCH 15/20] mypy --- src/opengeodeweb_microservice/database/connection.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/opengeodeweb_microservice/database/connection.py b/src/opengeodeweb_microservice/database/connection.py index 3a3b0a9..d862c87 100644 --- a/src/opengeodeweb_microservice/database/connection.py +++ b/src/opengeodeweb_microservice/database/connection.py @@ -28,7 +28,7 @@ def init_database(db_path: str = DATABASE_FILENAME) -> None: print(f"Database engine already exists for {db_path}, reusing", flush=True) -def get_session() -> scoped_session[Session]: +def get_session() -> Session: if scoped_session_registry is None: raise RuntimeError() return scoped_session_registry() From c801bdb6c4b1b12dae05b6f3d704970ccce14d40 Mon Sep 17 00:00:00 2001 From: MaxNumerique <144453705+MaxNumerique@users.noreply.github.com> Date: Thu, 9 Oct 2025 14:19:22 +0000 Subject: [PATCH 16/20] Apply prepare changes --- requirements.txt | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 4dc3710..6593b99 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,2 +1,15 @@ -SQLAlchemy==2.0.43 +# +# This file is autogenerated by pip-compile with Python 3.12 +# by the following command: +# +# pip-compile --output-file=./requirements.txt ./requirements.in +# fastjsonschema==2.21.1 + # via -r requirements.in +greenlet==3.2.4 + # via sqlalchemy +sqlalchemy==2.0.43 + # via -r requirements.in +typing-extensions==4.15.0 + # via sqlalchemy + From dee349c681346d8a83ddbe56fa32c41f52711102 Mon Sep 17 00:00:00 2001 From: MaxNumerique <144453705+MaxNumerique@users.noreply.github.com> Date: Mon, 13 Oct 2025 14:51:06 +0000 Subject: [PATCH 17/20] Apply prepare changes --- requirements.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/requirements.txt b/requirements.txt index 6593b99..2d8547b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -6,10 +6,10 @@ # fastjsonschema==2.21.1 # via -r requirements.in -greenlet==3.2.4 +greenlet>=3 # via sqlalchemy -sqlalchemy==2.0.43 +sqlalchemy>=2 # via -r requirements.in -typing-extensions==4.15.0 +typing-extensions>=4 # via sqlalchemy From 844d53f57645d8e603018e66276c5de2fb3e81a2 Mon Sep 17 00:00:00 2001 From: MaxNumerique <144453705+MaxNumerique@users.noreply.github.com> Date: Tue, 14 Oct 2025 07:11:30 +0000 Subject: [PATCH 18/20] Apply prepare changes --- requirements.txt | 25 ++----------------------- 1 file changed, 2 insertions(+), 23 deletions(-) diff --git a/requirements.txt b/requirements.txt index d6b4746..2d8547b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,33 +4,12 @@ # # pip-compile --output-file=./requirements.txt ./requirements.in # -blinker>=1 - # via flask -click>=8 - # via flask fastjsonschema==2.21.1 # via -r requirements.in -flask>=3 - # via flask-sqlalchemy -flask-sqlalchemy==3.1.1 - # via -r requirements.in greenlet>=3 # via sqlalchemy -itsdangerous>=2 - # via flask -jinja2>=3 - # via flask -markupsafe>=3 - # via - # flask - # jinja2 - # werkzeug -sqlalchemy==2.0.43 - # via - # -r requirements.in - # flask-sqlalchemy +sqlalchemy>=2 + # via -r requirements.in typing-extensions>=4 # via sqlalchemy -werkzeug>=3 - # via flask From f44c1aa35ee80bbb5cbd07c61dd7c60fe80c1053 Mon Sep 17 00:00:00 2001 From: MaxNumerique Date: Tue, 14 Oct 2025 13:40:50 +0200 Subject: [PATCH 19/20] adding bool for init_database function to know if tables have already been created --- src/opengeodeweb_microservice/database/connection.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/opengeodeweb_microservice/database/connection.py b/src/opengeodeweb_microservice/database/connection.py index d862c87..2e8cbca 100644 --- a/src/opengeodeweb_microservice/database/connection.py +++ b/src/opengeodeweb_microservice/database/connection.py @@ -11,7 +11,7 @@ scoped_session_registry = None -def init_database(db_path: str = DATABASE_FILENAME) -> None: +def init_database(db_path: str = DATABASE_FILENAME, create_tables: bool = True) -> None: global engine, session_factory, scoped_session_registry if engine is None: @@ -22,8 +22,11 @@ def init_database(db_path: str = DATABASE_FILENAME) -> None: print(f"Database engine created for {db_path}", flush=True) session_factory = sessionmaker(bind=engine) scoped_session_registry = scoped_session(session_factory) - Base.metadata.create_all(engine) - print(f"Database engine created DONE for {db_path}") + if create_tables: + Base.metadata.create_all(engine) + print(f"Database tables created for {db_path}", flush=True) + else: + print(f"Database connected (tables not created) for {db_path}", flush=True) else: print(f"Database engine already exists for {db_path}, reusing", flush=True) From f9cc61a2bd12b28a88657f4890fdb06626fb7e00 Mon Sep 17 00:00:00 2001 From: MaxNumerique Date: Tue, 14 Oct 2025 14:09:38 +0200 Subject: [PATCH 20/20] typed get() --- src/opengeodeweb_microservice/database/data.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/opengeodeweb_microservice/database/data.py b/src/opengeodeweb_microservice/database/data.py index 22309ef..918ce0b 100644 --- a/src/opengeodeweb_microservice/database/data.py +++ b/src/opengeodeweb_microservice/database/data.py @@ -1,9 +1,8 @@ -from sqlalchemy import String, JSON +from sqlalchemy import String, JSON, select from sqlalchemy.orm import Mapped, mapped_column from .connection import get_session from .base import Base import uuid -from typing import cast class Data(Base): @@ -47,4 +46,5 @@ def create( @staticmethod def get(data_id: str) -> "Data | None": session = get_session() - return cast("Data | None", session.get(Data, data_id)) + data_query = select(Data).where(Data.id == data_id) + return session.scalars(data_query).first()