From ce9584a89eeefbbfc2527a3a592b256d3a553073 Mon Sep 17 00:00:00 2001 From: kompotkot Date: Wed, 9 Mar 2022 11:40:34 +0000 Subject: [PATCH] Moonstreamdb with read only --- db/configs/docker_generate_env.bash | 1 + db/configs/sample.env | 1 + db/moonstreamdb/db.py | 31 +++++++++++++++++++++++++++++ db/moonstreamdb/version.py | 2 +- 4 files changed, 34 insertions(+), 1 deletion(-) diff --git a/db/configs/docker_generate_env.bash b/db/configs/docker_generate_env.bash index 0ef9c16f..306a1d3b 100755 --- a/db/configs/docker_generate_env.bash +++ b/db/configs/docker_generate_env.bash @@ -41,6 +41,7 @@ sed --in-place 's|^export * ||' "$SCRIPT_DIR/$DOCKER_MOONSTREAMDB_ENV_FILE" sed --in-place 's|"||g' "$SCRIPT_DIR/$DOCKER_MOONSTREAMDB_ENV_FILE" sed -i "s|^MOONSTREAM_DB_URI=.*|MOONSTREAM_DB_URI=$DOCKER_MOONSTREAMDB_DB_URI|" "$SCRIPT_DIR/$DOCKER_MOONSTREAMDB_ENV_FILE" +sed -i "s|^MOONSTREAM_DB_URI_READ_ONLY=.*|MOONSTREAM_DB_URI_READ_ONLY=$DOCKER_MOONSTREAMDB_DB_URI|" "$SCRIPT_DIR/$DOCKER_MOONSTREAMDB_ENV_FILE" # Generate alembic config diff --git a/db/configs/sample.env b/db/configs/sample.env index c5409401..8cfb9a45 100644 --- a/db/configs/sample.env +++ b/db/configs/sample.env @@ -1,3 +1,4 @@ # Required environment variables to work with database CLI export MOONSTREAM_DB_URI="postgresql://:@:/" +export MOONSTREAM_DB_URI_READ_ONLY="postgresql://:@:/" export MOONSTREAM_POOL_SIZE=0 diff --git a/db/moonstreamdb/db.py b/db/moonstreamdb/db.py index bfe055e9..4e6c7383 100644 --- a/db/moonstreamdb/db.py +++ b/db/moonstreamdb/db.py @@ -11,6 +11,10 @@ MOONSTREAM_DB_URI = os.environ.get("MOONSTREAM_DB_URI") if MOONSTREAM_DB_URI is None: raise ValueError("MOONSTREAM_DB_URI environment variable must be set") +MOONSTREAM_DB_URI_READ_ONLY = os.environ.get("MOONSTREAM_DB_URI_READ_ONLY") +if MOONSTREAM_DB_URI_READ_ONLY is None: + raise ValueError("MOONSTREAM_DB_URI_READ_ONLY environment variable must be set") + MOONSTREAM_POOL_SIZE_RAW = os.environ.get("MOONSTREAM_POOL_SIZE", 0) try: if MOONSTREAM_POOL_SIZE_RAW is not None: @@ -60,3 +64,30 @@ def yield_db_session() -> Session: yield_db_session_ctx = contextmanager(yield_db_session) + +# Read only + +RO_engine = create_engine( + MOONSTREAM_DB_URI_READ_ONLY, + pool_size=MOONSTREAM_POOL_SIZE, + connect_args={ + "options": f"-c statement_timeout={MOONSTREAM_DB_STATEMENT_TIMEOUT_MILLIS}" + }, +) +RO_SessionLocal = sessionmaker(bind=RO_engine) + + +def yield_db_read_only_session() -> Session: + """ + Yields a database connection (created using environment variables). + As per FastAPI docs: + https://fastapi.tiangolo.com/tutorial/sql-databases/#create-a-dependency + """ + session = RO_SessionLocal() + try: + yield session + finally: + session.close() + + +yield_db_read_only_session_ctx = contextmanager(yield_db_read_only_session) diff --git a/db/moonstreamdb/version.py b/db/moonstreamdb/version.py index 7f3d3eaa..80ecc71f 100644 --- a/db/moonstreamdb/version.py +++ b/db/moonstreamdb/version.py @@ -2,4 +2,4 @@ Moonstream database version. """ -MOONSTREAMDB_VERSION = "0.2.2" +MOONSTREAMDB_VERSION = "0.2.3"