From f87378c5502eba5fcd3df550f1e8ca9a3b990bd2 Mon Sep 17 00:00:00 2001 From: Bedram Tamang Date: Thu, 23 Jul 2026 14:24:00 -0700 Subject: [PATCH] fix(orm): build correct SQLite URLs in ConnectionFactory.build_url() SQLite was going through the same {scheme}://{user}:{pwd}@{host}:{port}/{db} template as postgres/mysql, producing an empty port segment (sqlite+aiosqlite://:@localhost:/database.sqlite) that crashes SQLAlchemy's URL._assert_port(). SQLite connections have no host/user/password/port, so build the URL as {scheme}:///{db} instead, which also correctly yields a four-slash URL for absolute paths. --- .../masoniteorm/connections/factory.py | 6 +++- .../tests/masoniteorm/config/test_db_url.py | 29 +++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm/connections/factory.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm/connections/factory.py index 6c2b1586..04a68781 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm/connections/factory.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm/connections/factory.py @@ -26,11 +26,15 @@ def build_url(cls, config: dict) -> str: driver = config["driver"] scheme = cls.DRIVER_URLS[driver] + db = config.get("database", "") + + if driver == "sqlite": + return f"{scheme}:///{db}" + user = config.get("username", "") pwd = config.get("password", "") host = config.get("host", "localhost") port = config.get("port", "") - db = config.get("database", "") return f"{scheme}://{user}:{pwd}@{host}:{port}/{db}" @classmethod diff --git a/fastapi_startkit/tests/masoniteorm/config/test_db_url.py b/fastapi_startkit/tests/masoniteorm/config/test_db_url.py index d1ebcd62..e094d51a 100644 --- a/fastapi_startkit/tests/masoniteorm/config/test_db_url.py +++ b/fastapi_startkit/tests/masoniteorm/config/test_db_url.py @@ -30,6 +30,35 @@ def test_postgres_config(self): url = ConnectionFactory.build_url(config) self.assertEqual(url, "postgresql+asyncpg://user:pass@db.example.com:5432/mydb") + def test_sqlite_config_relative_database(self): + config = { + "driver": "sqlite", + "database": "database.sqlite", + } + url = ConnectionFactory.build_url(config) + self.assertEqual(url, "sqlite+aiosqlite:///database.sqlite") + + def test_sqlite_config_absolute_database(self): + config = { + "driver": "sqlite", + "database": "/var/data/database.sqlite", + } + url = ConnectionFactory.build_url(config) + self.assertEqual(url, "sqlite+aiosqlite:////var/data/database.sqlite") + + def test_sqlite_config_ignores_host_user_password_port(self): + """SQLite has no host/user/password/port -- extra keys must not leak into the URL.""" + config = { + "driver": "sqlite", + "database": "database.sqlite", + "host": "localhost", + "username": "root", + "password": "secret", + "port": "", + } + url = ConnectionFactory.build_url(config) + self.assertEqual(url, "sqlite+aiosqlite:///database.sqlite") + def test_sqlite_config_via_url_passthrough(self): config = { "driver": "sqlite",