Skip to content
This repository was archived by the owner on Aug 19, 2025. It is now read-only.

Commit 121dc66

Browse files
committed
Add missing connection timeout
1 parent b0eae59 commit 121dc66

File tree

3 files changed

+27
-14
lines changed

3 files changed

+27
-14
lines changed

.github/workflows/test-suite.yml

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,6 @@ jobs:
1111
tests:
1212
name: "Python ${{ matrix.python-version }}"
1313
runs-on: "ubuntu-latest"
14-
env:
15-
MSSQL_SA_PASSWORD: Mssql123$#mssql
16-
1714
strategy:
1815
matrix:
1916
python-version: ["3.7", "3.8", "3.9", "3.10", "3.11"]
@@ -43,13 +40,13 @@ jobs:
4340
mssql:
4441
image: mcr.microsoft.com/mssql/server:2019-GA-ubuntu-16.04
4542
env:
46-
MSSQL_SA_PASSWORD: ${{ env.MSSQL_SA_PASSWORD }}
43+
MSSQL_SA_PASSWORD: Mssql123mssql-
4744
ACCEPT_EULA: "Y"
48-
MSSQL_PID: Express
45+
MSSQL_PID: Developer
4946
ports:
50-
- 1433/tcp
47+
- 1433:1433
5148
options: >-
52-
--health-cmd "/opt/mssql-tools/bin/sqlcmd -U sa -P $MSSQL_SA_PASSWORD -Q 'select 1' -b -o /dev/null"
49+
--health-cmd "/opt/mssql-tools/bin/sqlcmd -U sa -P Mssql123mssql- -Q 'select 1' -b -o /dev/null"
5350
--health-interval 60s
5451
--health-timeout 30s
5552
--health-start-period 20s
@@ -82,7 +79,7 @@ jobs:
8279
postgresql://username:password@localhost:5432/testsuite,
8380
postgresql+aiopg://username:[email protected]:5432/testsuite,
8481
postgresql+asyncpg://username:password@localhost:5432/testsuite,
85-
mssql://sa:Mssql123$#[email protected]:1433/master?driver=ODBC+Driver+17+for+SQL+Server,
86-
mssql+pyodbc://sa:Mssql123$#[email protected]:1433/master?driver=ODBC+Driver+17+for+SQL+Server,
87-
mssql+aioodbc://sa:Mssql123$#[email protected]:1433/master?driver=ODBC+Driver+17+for+SQL+Server
82+
mssql://sa:Mssql123mssql-@localhost:1433/master?driver=ODBC+Driver+17+for+SQL+Server,
83+
mssql+pyodbc://sa:Mssql123mssql-@localhost:1433/master?driver=ODBC+Driver+17+for+SQL+Server,
84+
mssql+aioodbc://sa:Mssql123mssql-@localhost:1433/master?driver=ODBC+Driver+17+for+SQL+Server
8885
run: "scripts/test"

databases/backends/mssql.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ def _get_connection_kwargs(self) -> dict:
4141
pool_recycle = url_options.get("pool_recycle")
4242
ssl = url_options.get("ssl")
4343
driver = url_options.get("driver")
44+
timeout = url_options.get("connection_timeout", 30)
4445
trusted_connection = url_options.get("trusted_connection", "no")
4546

4647
assert driver is not None, "The driver must be specified"
@@ -56,6 +57,7 @@ def _get_connection_kwargs(self) -> dict:
5657

5758
kwargs["trusted_connection"] = trusted_connection.lower()
5859
kwargs["driver"] = driver
60+
kwargs["timeout"] = timeout
5961

6062
for key, value in self._options.items():
6163
# Coerce 'min_size' and 'max_size' for consistency.
@@ -77,8 +79,12 @@ async def connect(self) -> None:
7779
port = self._database_url.port or 1433
7880
user = self._database_url.username or getpass.getuser()
7981
password = self._database_url.password
82+
timeout = kwargs.pop("timeout")
8083

81-
dsn = f"Driver={driver};Database={database};Server={hostname},{port};UID={user};PWD={password};"
84+
if port:
85+
dsn = f"Driver={driver};Database={database};Server={hostname},{port};UID={user};PWD={password};Connection+Timeout={timeout}"
86+
else:
87+
dsn = f"Driver={driver};Database={database};Server={hostname},{port};UID={user};PWD={password};Connection+Timeout={timeout}"
8288

8389
self._pool = await aioodbc.create_pool(
8490
dsn=dsn,

tests/test_integration.py

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,15 @@ def create_test_database():
2929
"postgresql+aiopg",
3030
"sqlite+aiosqlite",
3131
"postgresql+asyncpg",
32+
]:
33+
url = str(database_url.replace(driver=None))
34+
elif database_url.scheme in [
35+
"mssql",
3236
"mssql+pyodbc",
3337
"mssql+aioodbc",
38+
"mssql+pymssql",
3439
]:
35-
url = str(database_url.replace(driver=None))
40+
url = str(database_url.replace(driver="pyodbc"))
3641
engine = sqlalchemy.create_engine(url)
3742
metadata.create_all(engine)
3843

@@ -43,14 +48,19 @@ def create_test_database():
4348
database_url = DatabaseURL(url)
4449
if database_url.scheme in ["mysql", "mysql+aiomysql", "mysql+asyncmy"]:
4550
url = str(database_url.replace(driver="pymysql"))
46-
if database_url.scheme in ["mssql", "mssql+aioodbc"]:
47-
url = str(database_url.replace(driver="pyodbc"))
4851
elif database_url.scheme in [
4952
"postgresql+aiopg",
5053
"sqlite+aiosqlite",
5154
"postgresql+asyncpg",
5255
]:
5356
url = str(database_url.replace(driver=None))
57+
elif database_url.scheme in [
58+
"mssql",
59+
"mssql+pyodbc",
60+
"mssql+aioodbc",
61+
"mssql+pymssql",
62+
]:
63+
url = str(database_url.replace(driver="pyodbc"))
5464
engine = sqlalchemy.create_engine(url)
5565
metadata.drop_all(engine)
5666

0 commit comments

Comments
 (0)