From 49870651fd20157fdeba2d96b928e720a5d9b968 Mon Sep 17 00:00:00 2001 From: Michael Hadam Date: Wed, 22 Sep 2021 18:01:02 -0400 Subject: [PATCH 01/22] Add postgresql+asyncpg scheme prefix (closes #395) --- databases/core.py | 1 + 1 file changed, 1 insertion(+) diff --git a/databases/core.py b/databases/core.py index 727802d4..92ac31ff 100644 --- a/databases/core.py +++ b/databases/core.py @@ -43,6 +43,7 @@ class Database: SUPPORTED_BACKENDS = { "postgresql": "databases.backends.postgres:PostgresBackend", + "postgresql+asyncpg": "databases.backends.postgres:PostgresBackend", "postgresql+aiopg": "databases.backends.aiopg:AiopgBackend", "postgres": "databases.backends.postgres:PostgresBackend", "mysql": "databases.backends.mysql:MySQLBackend", From e493075c0b88f30006b20260c0ee21180b5bc046 Mon Sep 17 00:00:00 2001 From: Michael Hadam Date: Thu, 23 Sep 2021 09:44:48 -0400 Subject: [PATCH 02/22] Undo backend change --- databases/core.py | 1 - 1 file changed, 1 deletion(-) diff --git a/databases/core.py b/databases/core.py index 92ac31ff..727802d4 100644 --- a/databases/core.py +++ b/databases/core.py @@ -43,7 +43,6 @@ class Database: SUPPORTED_BACKENDS = { "postgresql": "databases.backends.postgres:PostgresBackend", - "postgresql+asyncpg": "databases.backends.postgres:PostgresBackend", "postgresql+aiopg": "databases.backends.aiopg:AiopgBackend", "postgres": "databases.backends.postgres:PostgresBackend", "mysql": "databases.backends.mysql:MySQLBackend", From f63a98d9b15f6c55cac8cb123ecb272ed7d64f35 Mon Sep 17 00:00:00 2001 From: mhadam Date: Thu, 23 Sep 2021 10:07:19 -0400 Subject: [PATCH 03/22] Add SUPPORTED_BACKENDS strategy (closes #395) --- databases/core.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/databases/core.py b/databases/core.py index 727802d4..839e58f5 100644 --- a/databases/core.py +++ b/databases/core.py @@ -62,7 +62,7 @@ def __init__( self._force_rollback = force_rollback - backend_str = self.SUPPORTED_BACKENDS[self.url.scheme] + backend_str = self._get_backend() backend_cls = import_from_string(backend_str) assert issubclass(backend_cls, DatabaseBackend) self._backend = backend_cls(self.url, **self.options) @@ -329,6 +329,13 @@ def _build_query( return query + def _get_backend(self) -> Optional[str]: + try: + return self.SUPPORTED_BACKENDS[self.url.scheme] + except KeyError: + return self.SUPPORTED_BACKENDS[self.url.dialect] + + class Transaction: def __init__( From 5b21e787fdea4f96206de1a33879ae977b497954 Mon Sep 17 00:00:00 2001 From: mhadam Date: Thu, 23 Sep 2021 14:58:18 -0400 Subject: [PATCH 04/22] Move to correct class --- databases/core.py | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/databases/core.py b/databases/core.py index 839e58f5..94779ebc 100644 --- a/databases/core.py +++ b/databases/core.py @@ -220,6 +220,12 @@ def force_rollback(self) -> typing.Iterator[None]: finally: self._force_rollback = initial + def _get_backend(self) -> typing.Optional[str]: + try: + return self.SUPPORTED_BACKENDS[self.url.scheme] + except KeyError: + return self.SUPPORTED_BACKENDS[self.url.dialect] + class Connection: def __init__(self, backend: DatabaseBackend) -> None: @@ -329,13 +335,6 @@ def _build_query( return query - def _get_backend(self) -> Optional[str]: - try: - return self.SUPPORTED_BACKENDS[self.url.scheme] - except KeyError: - return self.SUPPORTED_BACKENDS[self.url.dialect] - - class Transaction: def __init__( From 262abe15c24c6ca4b9864ac4bb24c389de92e2f7 Mon Sep 17 00:00:00 2001 From: mhadam Date: Thu, 23 Sep 2021 22:05:02 -0400 Subject: [PATCH 05/22] Add unit test for SUPPORTED_BACKENDS scheme matching --- tests/test_databases.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/tests/test_databases.py b/tests/test_databases.py index 445a2453..91d7128c 100644 --- a/tests/test_databases.py +++ b/tests/test_databases.py @@ -1116,3 +1116,11 @@ async def test_postcompile_queries(database_url): results = await database.fetch_all(query=query) assert len(results) == 0 + + +@pytest.mark.parametrize("database_url", DATABASE_URLS) +@async_adapter +async def test_supported_backends_schemes(database_url): + async with Database(database_url) as database: + backend_str = database._get_backend() + assert backend_str in database.SUPPORTED_BACKENDS.values() From cba7e57e554d48a244cf02081f44e752f80023d1 Mon Sep 17 00:00:00 2001 From: mhadam Date: Thu, 23 Sep 2021 22:27:51 -0400 Subject: [PATCH 06/22] Add asyncpg driver url to test-suite.yml --- .github/workflows/test-suite.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test-suite.yml b/.github/workflows/test-suite.yml index 700a2490..ac696240 100644 --- a/.github/workflows/test-suite.yml +++ b/.github/workflows/test-suite.yml @@ -47,5 +47,5 @@ jobs: run: "scripts/install" - name: "Run tests" env: - TEST_DATABASE_URLS: "sqlite:///testsuite, mysql://username:password@localhost:3306/testsuite, postgresql://username:password@localhost:5432/testsuite, postgresql+aiopg://username:password@127.0.0.1:5432/testsuite" + TEST_DATABASE_URLS: "sqlite:///testsuite, mysql://username:password@localhost:3306/testsuite, postgresql://username:password@localhost:5432/testsuite, postgresql+aiopg://username:password@127.0.0.1:5432/testsuite, postgresql+asyncpg://username:password@localhost:5432/testsuite" run: "scripts/test" From 1bff5c9af4c82957457dca0400e95cb23b3928b3 Mon Sep 17 00:00:00 2001 From: mhadam Date: Fri, 24 Sep 2021 01:14:25 -0400 Subject: [PATCH 07/22] Ignore asyncpg driver for test database engine --- tests/test_databases.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/test_databases.py b/tests/test_databases.py index 91d7128c..f6ef67f9 100644 --- a/tests/test_databases.py +++ b/tests/test_databases.py @@ -87,6 +87,8 @@ def create_test_database(): url = str(database_url.replace(driver="pymysql")) elif database_url.scheme == "postgresql+aiopg": url = str(database_url.replace(driver=None)) + elif database_url.scheme == "postgresql+asyncpg": + url = str(database_url.replace(driver=None)) engine = sqlalchemy.create_engine(url) metadata.create_all(engine) @@ -100,6 +102,8 @@ def create_test_database(): url = str(database_url.replace(driver="pymysql")) elif database_url.scheme == "postgresql+aiopg": url = str(database_url.replace(driver=None)) + elif database_url.scheme == "postgresql+asyncpg": + url = str(database_url.replace(driver=None)) engine = sqlalchemy.create_engine(url) metadata.drop_all(engine) From 19adb265f0e25423a3f37a79827afe5fe764e085 Mon Sep 17 00:00:00 2001 From: mhadam Date: Fri, 24 Sep 2021 10:13:54 -0400 Subject: [PATCH 08/22] Fix integration tests for other schemes --- tests/test_databases.py | 12 ++++++------ tests/test_integration.py | 12 ++++++++---- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/tests/test_databases.py b/tests/test_databases.py index f6ef67f9..9fe4e9f3 100644 --- a/tests/test_databases.py +++ b/tests/test_databases.py @@ -83,11 +83,11 @@ def create_test_database(): # Create test databases with tables creation for url in DATABASE_URLS: database_url = DatabaseURL(url) - if database_url.scheme == "mysql": + if database_url.scheme in ["mysql", "mysql+aiomysql"]: url = str(database_url.replace(driver="pymysql")) - elif database_url.scheme == "postgresql+aiopg": + elif database_url.scheme in ["postgresql+aiopg", "postgresql+asyncpg"]: url = str(database_url.replace(driver=None)) - elif database_url.scheme == "postgresql+asyncpg": + elif database_url.scheme in ["sqlite", "sqlite+aiosqlite"]: url = str(database_url.replace(driver=None)) engine = sqlalchemy.create_engine(url) metadata.create_all(engine) @@ -98,11 +98,11 @@ def create_test_database(): # Drop test databases for url in DATABASE_URLS: database_url = DatabaseURL(url) - if database_url.scheme == "mysql": + if database_url.scheme in ["mysql", "mysql+aiomysql"]: url = str(database_url.replace(driver="pymysql")) - elif database_url.scheme == "postgresql+aiopg": + elif database_url.scheme in ["postgresql+aiopg", "postgresql+asyncpg"]: url = str(database_url.replace(driver=None)) - elif database_url.scheme == "postgresql+asyncpg": + elif database_url.scheme in ["sqlite", "sqlite+aiosqlite"]: url = str(database_url.replace(driver=None)) engine = sqlalchemy.create_engine(url) metadata.drop_all(engine) diff --git a/tests/test_integration.py b/tests/test_integration.py index c0cef2db..fc5e0295 100644 --- a/tests/test_integration.py +++ b/tests/test_integration.py @@ -28,9 +28,11 @@ def create_test_database(): # Create test databases for url in DATABASE_URLS: database_url = DatabaseURL(url) - if database_url.scheme == "mysql": + if database_url.scheme in ["mysql", "mysql+aiomysql"]: url = str(database_url.replace(driver="pymysql")) - elif database_url.scheme == "postgresql+aiopg": + elif database_url.scheme in ["postgresql+aiopg", "postgresql+asyncpg"]: + url = str(database_url.replace(driver=None)) + elif database_url.scheme in ["sqlite", "sqlite+aiosqlite"]: url = str(database_url.replace(driver=None)) engine = sqlalchemy.create_engine(url) metadata.create_all(engine) @@ -41,9 +43,11 @@ def create_test_database(): # Drop test databases for url in DATABASE_URLS: database_url = DatabaseURL(url) - if database_url.scheme == "mysql": + if database_url.scheme in ["mysql", "mysql+aiomysql"]: url = str(database_url.replace(driver="pymysql")) - elif database_url.scheme == "postgresql+aiopg": + elif database_url.scheme in ["postgresql+aiopg", "postgresql+asyncpg"]: + url = str(database_url.replace(driver=None)) + elif database_url.scheme in ["sqlite", "sqlite+aiosqlite"]: url = str(database_url.replace(driver=None)) engine = sqlalchemy.create_engine(url) metadata.drop_all(engine) From 9ed5b0771fd7d8dfe5ee3065b49eb7c23f29f486 Mon Sep 17 00:00:00 2001 From: mhadam Date: Fri, 24 Sep 2021 10:58:56 -0400 Subject: [PATCH 09/22] Remove unit test --- tests/test_databases.py | 8 -------- 1 file changed, 8 deletions(-) diff --git a/tests/test_databases.py b/tests/test_databases.py index 9fe4e9f3..596efad4 100644 --- a/tests/test_databases.py +++ b/tests/test_databases.py @@ -1120,11 +1120,3 @@ async def test_postcompile_queries(database_url): results = await database.fetch_all(query=query) assert len(results) == 0 - - -@pytest.mark.parametrize("database_url", DATABASE_URLS) -@async_adapter -async def test_supported_backends_schemes(database_url): - async with Database(database_url) as database: - backend_str = database._get_backend() - assert backend_str in database.SUPPORTED_BACKENDS.values() From febdd7cce8eda2b824be6d70913d87d29a7926ba Mon Sep 17 00:00:00 2001 From: mhadam Date: Fri, 24 Sep 2021 11:10:17 -0400 Subject: [PATCH 10/22] Amend postgresql+asyncpg to postgresql cases --- tests/test_databases.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/test_databases.py b/tests/test_databases.py index 596efad4..e145d121 100644 --- a/tests/test_databases.py +++ b/tests/test_databases.py @@ -859,7 +859,7 @@ async def test_queries_with_expose_backend_connection(database_url): if database.url.scheme in ["mysql", "postgresql+aiopg"]: cursor = await raw_connection.cursor() await cursor.execute(insert_query, values) - elif database.url.scheme == "postgresql": + elif database.url.scheme in ["postgresql", "postgresql+asyncpg"]: await raw_connection.execute(insert_query, *values) elif database.url.scheme == "sqlite": await raw_connection.execute(insert_query, values) @@ -886,7 +886,7 @@ async def test_queries_with_expose_backend_connection(database_url): cursor = await raw_connection.cursor() await cursor.execute(select_query) results = await cursor.fetchall() - elif database.url.scheme == "postgresql": + elif database.url.scheme in ["postgresql", "postgresql+asyncpg"]: results = await raw_connection.fetch(select_query) elif database.url.scheme == "sqlite": results = await raw_connection.execute_fetchall(select_query) @@ -901,7 +901,7 @@ async def test_queries_with_expose_backend_connection(database_url): assert results[2][2] == True # fetch_one() - if database.url.scheme == "postgresql": + if database.url.scheme in ["postgresql", "postgresql+asyncpg"]: result = await raw_connection.fetchrow(select_query) else: cursor = await raw_connection.cursor() @@ -1069,7 +1069,7 @@ async def test_posgres_interface(database_url): """ database_url = DatabaseURL(database_url) - if database_url.scheme != "postgresql": + if database_url.scheme not in ["postgresql", "postgresql+asyncpg"]: pytest.skip("Test is only for postgresql") async with Database(database_url) as database: From 7e373fab0601646a97d20c96a7e32c1158cb8573 Mon Sep 17 00:00:00 2001 From: mhadam Date: Fri, 24 Sep 2021 11:39:11 -0400 Subject: [PATCH 11/22] Fix _get_backend return type annotation --- databases/core.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/databases/core.py b/databases/core.py index 94779ebc..95040547 100644 --- a/databases/core.py +++ b/databases/core.py @@ -220,7 +220,7 @@ def force_rollback(self) -> typing.Iterator[None]: finally: self._force_rollback = initial - def _get_backend(self) -> typing.Optional[str]: + def _get_backend(self) -> str: try: return self.SUPPORTED_BACKENDS[self.url.scheme] except KeyError: From f19ab7685787978efd4b3e9f490a1d2eec2f8d6b Mon Sep 17 00:00:00 2001 From: Michael Hadam Date: Fri, 24 Sep 2021 18:53:32 -0400 Subject: [PATCH 12/22] Add more schemes to TEST_DATABASE_URLS Co-authored-by: Amin Alaee --- .github/workflows/test-suite.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test-suite.yml b/.github/workflows/test-suite.yml index ac696240..da12a51e 100644 --- a/.github/workflows/test-suite.yml +++ b/.github/workflows/test-suite.yml @@ -47,5 +47,5 @@ jobs: run: "scripts/install" - name: "Run tests" env: - TEST_DATABASE_URLS: "sqlite:///testsuite, mysql://username:password@localhost:3306/testsuite, postgresql://username:password@localhost:5432/testsuite, postgresql+aiopg://username:password@127.0.0.1:5432/testsuite, postgresql+asyncpg://username:password@localhost:5432/testsuite" + TEST_DATABASE_URLS: "sqlite:///testsuite, sqlite+aiosqlite:///testsuite, mysql://username:password@localhost:3306/testsuite, mysql+aiomysql://username:password@localhost:3306/testsuite, postgresql://username:password@localhost:5432/testsuite, postgresql+aiopg://username:password@127.0.0.1:5432/testsuite, postgresql+asyncpg://username:password@localhost:5432/testsuite" run: "scripts/test" From 4203c5f79fe409d0cfca5c8cab7f96b286c7f649 Mon Sep 17 00:00:00 2001 From: Amin Alaee Date: Sat, 25 Sep 2021 11:44:21 +0330 Subject: [PATCH 13/22] Update tests/test_integration.py --- tests/test_integration.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/test_integration.py b/tests/test_integration.py index fc5e0295..5fc33390 100644 --- a/tests/test_integration.py +++ b/tests/test_integration.py @@ -45,7 +45,9 @@ def create_test_database(): database_url = DatabaseURL(url) if database_url.scheme in ["mysql", "mysql+aiomysql"]: url = str(database_url.replace(driver="pymysql")) - elif database_url.scheme in ["postgresql+aiopg", "postgresql+asyncpg"]: + elif database_url.scheme == "postgresql+asyncpg": + url = str(database_url.replace(driver=None)) + engine = sqlalchemy.create_engine(url) url = str(database_url.replace(driver=None)) elif database_url.scheme in ["sqlite", "sqlite+aiosqlite"]: url = str(database_url.replace(driver=None)) From f66304808d5487f28422605ab9c56acb43ca1a7e Mon Sep 17 00:00:00 2001 From: Amin Alaee Date: Sat, 25 Sep 2021 11:44:30 +0330 Subject: [PATCH 14/22] Update tests/test_integration.py --- tests/test_integration.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/test_integration.py b/tests/test_integration.py index 5fc33390..c396e6ba 100644 --- a/tests/test_integration.py +++ b/tests/test_integration.py @@ -30,7 +30,9 @@ def create_test_database(): database_url = DatabaseURL(url) if database_url.scheme in ["mysql", "mysql+aiomysql"]: url = str(database_url.replace(driver="pymysql")) - elif database_url.scheme in ["postgresql+aiopg", "postgresql+asyncpg"]: + elif database_url.scheme == "postgresql+asyncpg": + url = str(database_url.replace(driver=None)) + engine = sqlalchemy.create_engine(url) url = str(database_url.replace(driver=None)) elif database_url.scheme in ["sqlite", "sqlite+aiosqlite"]: url = str(database_url.replace(driver=None)) From 723a77f59a15e5cb75f79dd240aedd6c8f0046e1 Mon Sep 17 00:00:00 2001 From: Amin Alaee Date: Sat, 25 Sep 2021 11:44:38 +0330 Subject: [PATCH 15/22] Update tests/test_databases.py --- tests/test_databases.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_databases.py b/tests/test_databases.py index e145d121..f0041e49 100644 --- a/tests/test_databases.py +++ b/tests/test_databases.py @@ -1069,7 +1069,7 @@ async def test_posgres_interface(database_url): """ database_url = DatabaseURL(database_url) - if database_url.scheme not in ["postgresql", "postgresql+asyncpg"]: + if database_url.dialect != "postgresql": pytest.skip("Test is only for postgresql") async with Database(database_url) as database: From 0bd1b068dd8f1054e06a98e4afb018d90518172f Mon Sep 17 00:00:00 2001 From: Amin Alaee Date: Sat, 25 Sep 2021 11:44:49 +0330 Subject: [PATCH 16/22] Update tests/test_databases.py --- tests/test_databases.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_databases.py b/tests/test_databases.py index f0041e49..38bd9871 100644 --- a/tests/test_databases.py +++ b/tests/test_databases.py @@ -888,7 +888,7 @@ async def test_queries_with_expose_backend_connection(database_url): results = await cursor.fetchall() elif database.url.scheme in ["postgresql", "postgresql+asyncpg"]: results = await raw_connection.fetch(select_query) - elif database.url.scheme == "sqlite": + elif database.url.scheme in ["sqlite", "sqlite+aiosqlite"]: results = await raw_connection.execute_fetchall(select_query) assert len(results) == 3 From 4618048d593dae455baf6951977ad4d1377783a3 Mon Sep 17 00:00:00 2001 From: Amin Alaee Date: Sat, 25 Sep 2021 11:44:55 +0330 Subject: [PATCH 17/22] Update tests/test_databases.py --- tests/test_databases.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_databases.py b/tests/test_databases.py index 38bd9871..13eafbff 100644 --- a/tests/test_databases.py +++ b/tests/test_databases.py @@ -861,7 +861,7 @@ async def test_queries_with_expose_backend_connection(database_url): await cursor.execute(insert_query, values) elif database.url.scheme in ["postgresql", "postgresql+asyncpg"]: await raw_connection.execute(insert_query, *values) - elif database.url.scheme == "sqlite": + elif database.url.scheme in ["sqlite", "sqlite+aiosqlite"]: await raw_connection.execute(insert_query, values) # execute_many() From 30ba1a26ad2e2a8c6e8949963fff30f8e242cff4 Mon Sep 17 00:00:00 2001 From: Amin Alaee Date: Sat, 25 Sep 2021 11:45:02 +0330 Subject: [PATCH 18/22] Update tests/test_databases.py --- tests/test_databases.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/test_databases.py b/tests/test_databases.py index 13eafbff..cb08da40 100644 --- a/tests/test_databases.py +++ b/tests/test_databases.py @@ -100,6 +100,10 @@ def create_test_database(): database_url = DatabaseURL(url) if database_url.scheme in ["mysql", "mysql+aiomysql"]: url = str(database_url.replace(driver="pymysql")) + elif database_url.scheme == "postgresql+aiopg": + url = str(database_url.replace(driver=None)) + engine = sqlalchemy.create_engine(url) + url = str(database_url.replace(driver="pymysql")) elif database_url.scheme in ["postgresql+aiopg", "postgresql+asyncpg"]: url = str(database_url.replace(driver=None)) elif database_url.scheme in ["sqlite", "sqlite+aiosqlite"]: From 11c34e10c9675576823cee7f9b3b0b979d9b34a4 Mon Sep 17 00:00:00 2001 From: Amin Alaee Date: Sat, 25 Sep 2021 11:45:09 +0330 Subject: [PATCH 19/22] Update tests/test_databases.py --- tests/test_databases.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/test_databases.py b/tests/test_databases.py index cb08da40..a65a59c6 100644 --- a/tests/test_databases.py +++ b/tests/test_databases.py @@ -85,6 +85,10 @@ def create_test_database(): database_url = DatabaseURL(url) if database_url.scheme in ["mysql", "mysql+aiomysql"]: url = str(database_url.replace(driver="pymysql")) + elif database_url.scheme == "postgresql+aiopg": + url = str(database_url.replace(driver=None)) + engine = sqlalchemy.create_engine(url) + url = str(database_url.replace(driver="pymysql")) elif database_url.scheme in ["postgresql+aiopg", "postgresql+asyncpg"]: url = str(database_url.replace(driver=None)) elif database_url.scheme in ["sqlite", "sqlite+aiosqlite"]: From 04d2bb24fef372f37c8e16048e09d904947e33e1 Mon Sep 17 00:00:00 2001 From: Amin Alaee Date: Sat, 25 Sep 2021 12:03:34 +0330 Subject: [PATCH 20/22] fix tests --- tests/test_databases.py | 52 ++++++++++++++++++++++----------------- tests/test_integration.py | 20 +++++++-------- 2 files changed, 40 insertions(+), 32 deletions(-) diff --git a/tests/test_databases.py b/tests/test_databases.py index a65a59c6..fb69a15b 100644 --- a/tests/test_databases.py +++ b/tests/test_databases.py @@ -4,7 +4,7 @@ import functools import os import re -from unittest.mock import patch, MagicMock +from unittest.mock import MagicMock, patch import pytest import sqlalchemy @@ -85,13 +85,11 @@ def create_test_database(): database_url = DatabaseURL(url) if database_url.scheme in ["mysql", "mysql+aiomysql"]: url = str(database_url.replace(driver="pymysql")) - elif database_url.scheme == "postgresql+aiopg": - url = str(database_url.replace(driver=None)) - engine = sqlalchemy.create_engine(url) - url = str(database_url.replace(driver="pymysql")) - elif database_url.scheme in ["postgresql+aiopg", "postgresql+asyncpg"]: - url = str(database_url.replace(driver=None)) - elif database_url.scheme in ["sqlite", "sqlite+aiosqlite"]: + elif database_url.scheme in [ + "postgresql+aiopg", + "sqlite+aiosqlite", + "postgresql+asyncpg", + ]: url = str(database_url.replace(driver=None)) engine = sqlalchemy.create_engine(url) metadata.create_all(engine) @@ -104,13 +102,11 @@ def create_test_database(): database_url = DatabaseURL(url) if database_url.scheme in ["mysql", "mysql+aiomysql"]: url = str(database_url.replace(driver="pymysql")) - elif database_url.scheme == "postgresql+aiopg": - url = str(database_url.replace(driver=None)) - engine = sqlalchemy.create_engine(url) - url = str(database_url.replace(driver="pymysql")) - elif database_url.scheme in ["postgresql+aiopg", "postgresql+asyncpg"]: - url = str(database_url.replace(driver=None)) - elif database_url.scheme in ["sqlite", "sqlite+aiosqlite"]: + elif database_url.scheme in [ + "postgresql+aiopg", + "sqlite+aiosqlite", + "postgresql+asyncpg", + ]: url = str(database_url.replace(driver=None)) engine = sqlalchemy.create_engine(url) metadata.drop_all(engine) @@ -490,7 +486,7 @@ async def test_transaction_commit_serializable(database_url): database_url = DatabaseURL(database_url) - if database_url.scheme != "postgresql": + if database_url.scheme not in ["postgresql", "postgresql+asyncpg"]: pytest.skip("Test (currently) only supports asyncpg") def insert_independently(): @@ -856,7 +852,11 @@ async def test_queries_with_expose_backend_connection(database_url): raw_connection = connection.raw_connection # Insert query - if database.url.scheme in ["mysql", "postgresql+aiopg"]: + if database.url.scheme in [ + "mysql", + "mysql+aiomysql", + "postgresql+aiopg", + ]: insert_query = "INSERT INTO notes (text, completed) VALUES (%s, %s)" else: insert_query = "INSERT INTO notes (text, completed) VALUES ($1, $2)" @@ -864,7 +864,11 @@ async def test_queries_with_expose_backend_connection(database_url): # execute() values = ("example1", True) - if database.url.scheme in ["mysql", "postgresql+aiopg"]: + if database.url.scheme in [ + "mysql", + "mysql+aiomysql", + "postgresql+aiopg", + ]: cursor = await raw_connection.cursor() await cursor.execute(insert_query, values) elif database.url.scheme in ["postgresql", "postgresql+asyncpg"]: @@ -875,7 +879,7 @@ async def test_queries_with_expose_backend_connection(database_url): # execute_many() values = [("example2", False), ("example3", True)] - if database.url.scheme == "mysql": + if database.url.scheme in ["mysql", "mysql+aiomysql"]: cursor = await raw_connection.cursor() await cursor.executemany(insert_query, values) elif database.url.scheme == "postgresql+aiopg": @@ -890,7 +894,11 @@ async def test_queries_with_expose_backend_connection(database_url): select_query = "SELECT notes.id, notes.text, notes.completed FROM notes" # fetch_all() - if database.url.scheme in ["mysql", "postgresql+aiopg"]: + if database.url.scheme in [ + "mysql", + "mysql+aiomysql", + "postgresql+aiopg", + ]: cursor = await raw_connection.cursor() await cursor.execute(select_query) results = await cursor.fetchall() @@ -1077,8 +1085,8 @@ async def test_posgres_interface(database_url): """ database_url = DatabaseURL(database_url) - if database_url.dialect != "postgresql": - pytest.skip("Test is only for postgresql") + if database_url.scheme not in ["postgresql", "postgresql+asyncpg"]: + pytest.skip("Test is only for asyncpg") async with Database(database_url) as database: async with database.transaction(force_rollback=True): diff --git a/tests/test_integration.py b/tests/test_integration.py index c396e6ba..f53471f6 100644 --- a/tests/test_integration.py +++ b/tests/test_integration.py @@ -30,11 +30,11 @@ def create_test_database(): database_url = DatabaseURL(url) if database_url.scheme in ["mysql", "mysql+aiomysql"]: url = str(database_url.replace(driver="pymysql")) - elif database_url.scheme == "postgresql+asyncpg": - url = str(database_url.replace(driver=None)) - engine = sqlalchemy.create_engine(url) - url = str(database_url.replace(driver=None)) - elif database_url.scheme in ["sqlite", "sqlite+aiosqlite"]: + elif database_url.scheme in [ + "postgresql+aiopg", + "sqlite+aiosqlite", + "postgresql+asyncpg", + ]: url = str(database_url.replace(driver=None)) engine = sqlalchemy.create_engine(url) metadata.create_all(engine) @@ -47,11 +47,11 @@ def create_test_database(): database_url = DatabaseURL(url) if database_url.scheme in ["mysql", "mysql+aiomysql"]: url = str(database_url.replace(driver="pymysql")) - elif database_url.scheme == "postgresql+asyncpg": - url = str(database_url.replace(driver=None)) - engine = sqlalchemy.create_engine(url) - url = str(database_url.replace(driver=None)) - elif database_url.scheme in ["sqlite", "sqlite+aiosqlite"]: + elif database_url.scheme in [ + "postgresql+aiopg", + "sqlite+aiosqlite", + "postgresql+asyncpg", + ]: url = str(database_url.replace(driver=None)) engine = sqlalchemy.create_engine(url) metadata.drop_all(engine) From 74a6d6a8ef841ffc845885166bc5da07d33ddb3e Mon Sep 17 00:00:00 2001 From: Amin Alaee Date: Sat, 25 Sep 2021 12:13:31 +0330 Subject: [PATCH 21/22] set driver in extra test --- tests/test_databases.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/test_databases.py b/tests/test_databases.py index fb69a15b..d2a2809e 100644 --- a/tests/test_databases.py +++ b/tests/test_databases.py @@ -489,6 +489,9 @@ async def test_transaction_commit_serializable(database_url): if database_url.scheme not in ["postgresql", "postgresql+asyncpg"]: pytest.skip("Test (currently) only supports asyncpg") + if database_url.scheme == "postgresql+asyncpg": + database_url = database_url.replace(driver=None) + def insert_independently(): engine = sqlalchemy.create_engine(str(database_url)) conn = engine.connect() From a3fc1ca0c2a83edea88b65d5c9ea301d5c9283f9 Mon Sep 17 00:00:00 2001 From: Amin Alaee Date: Sat, 25 Sep 2021 12:20:42 +0330 Subject: [PATCH 22/22] destroy database for each function --- tests/test_databases.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_databases.py b/tests/test_databases.py index d2a2809e..8fde4387 100644 --- a/tests/test_databases.py +++ b/tests/test_databases.py @@ -78,7 +78,7 @@ def process_result_value(self, value, dialect): ) -@pytest.fixture(autouse=True, scope="module") +@pytest.fixture(autouse=True, scope="function") def create_test_database(): # Create test databases with tables creation for url in DATABASE_URLS: