Skip to content

Commit a77eef6

Browse files
authored
v3.0.8 (#37)
Co-authored-by: ddc <ddc@users.noreply.github.com>
1 parent cebc584 commit a77eef6

28 files changed

Lines changed: 377 additions & 393 deletions

ddcDatabases/__init__.py

Lines changed: 43 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,39 @@
1-
from ddcDatabases.core.operations import DBUtils, DBUtilsAsync
2-
from ddcDatabases.core.persistent import PersistentConnectionConfig, close_all_persistent_connections
3-
from ddcDatabases.sqlite import (
4-
Sqlite,
5-
SqliteConnRetryConfig,
6-
SqliteOpRetryConfig,
7-
SqliteSessionConfig,
8-
)
9-
from importlib.metadata import version
101
import logging
11-
from typing import Literal, NamedTuple
2+
from .core.operations import DBUtils, DBUtilsAsync
3+
from .core.persistent import PersistentConnectionConfig, close_all_persistent_connections
4+
from importlib.metadata import version
125

136
__all__ = [
147
"DBUtils",
158
"DBUtilsAsync",
169
"PersistentConnectionConfig",
17-
"Sqlite",
18-
"SqliteConnRetryConfig",
19-
"SqliteOpRetryConfig",
20-
"SqliteSessionConfig",
2110
"close_all_persistent_connections",
2211
]
2312

2413
# Conditional imports based on available dependencies
14+
try:
15+
from .core.settings import clear_sqlite_settings_cache, get_sqlite_settings
16+
from .sqlite import (
17+
Sqlite,
18+
SqliteConnRetryConfig,
19+
SqliteOpRetryConfig,
20+
SqliteSessionConfig,
21+
)
22+
23+
__all__ += [
24+
"Sqlite",
25+
"SqliteConnRetryConfig",
26+
"SqliteOpRetryConfig",
27+
"SqliteSessionConfig",
28+
"clear_sqlite_settings_cache",
29+
"get_sqlite_settings",
30+
]
31+
except ImportError:
32+
pass
33+
2534
try:
2635
from .core.persistent import MongoDBPersistent
36+
from .core.settings import clear_mongodb_settings_cache, get_mongodb_settings
2737
from .mongodb import (
2838
MongoDB,
2939
MongoDBConnectionConfig,
@@ -41,12 +51,15 @@
4151
"MongoDBPersistent",
4252
"MongoDBQueryConfig",
4353
"MongoDBTLSConfig",
54+
"clear_mongodb_settings_cache",
55+
"get_mongodb_settings",
4456
]
4557
except ImportError:
4658
pass
4759

4860
try:
4961
from .core.persistent import MSSQLPersistent
62+
from .core.settings import clear_mssql_settings_cache, get_mssql_settings
5063
from .mssql import (
5164
MSSQL,
5265
MSSQLConnectionConfig,
@@ -66,12 +79,15 @@
6679
"MSSQLPoolConfig",
6780
"MSSQLSessionConfig",
6881
"MSSQLSSLConfig",
82+
"clear_mssql_settings_cache",
83+
"get_mssql_settings",
6984
]
7085
except ImportError:
7186
pass
7287

7388
try:
7489
from .core.persistent import MySQLPersistent
90+
from .core.settings import clear_mysql_settings_cache, get_mysql_settings
7591
from .mysql import (
7692
MySQL,
7793
MySQLConnectionConfig,
@@ -91,6 +107,8 @@
91107
MariaDBPoolConfig = MySQLPoolConfig
92108
MariaDBSessionConfig = MySQLSessionConfig
93109
MariaDBSSLConfig = MySQLSSLConfig
110+
clear_mariadb_settings_cache = clear_mysql_settings_cache
111+
get_mariadb_settings = get_mysql_settings
94112

95113
__all__ += [
96114
"MySQL",
@@ -101,6 +119,8 @@
101119
"MySQLPoolConfig",
102120
"MySQLSessionConfig",
103121
"MySQLSSLConfig",
122+
"clear_mysql_settings_cache",
123+
"get_mysql_settings",
104124
# MariaDB aliases
105125
"MariaDB",
106126
"MariaDBConnectionConfig",
@@ -110,12 +130,15 @@
110130
"MariaDBPoolConfig",
111131
"MariaDBSessionConfig",
112132
"MariaDBSSLConfig",
133+
"clear_mariadb_settings_cache",
134+
"get_mariadb_settings",
113135
]
114136
except ImportError:
115137
pass
116138

117139
try:
118140
from .core.persistent import OraclePersistent
141+
from .core.settings import clear_oracle_settings_cache, get_oracle_settings
119142
from .oracle import (
120143
Oracle,
121144
OracleConnectionConfig,
@@ -135,12 +158,15 @@
135158
"OraclePoolConfig",
136159
"OracleSessionConfig",
137160
"OracleSSLConfig",
161+
"clear_oracle_settings_cache",
162+
"get_oracle_settings",
138163
]
139164
except ImportError:
140165
pass
141166

142167
try:
143168
from .core.persistent import PostgreSQLPersistent
169+
from .core.settings import clear_postgresql_settings_cache, get_postgresql_settings
144170
from .postgresql import (
145171
PostgreSQL,
146172
PostgreSQLConnectionConfig,
@@ -160,6 +186,8 @@
160186
"PostgreSQLPoolConfig",
161187
"PostgreSQLSessionConfig",
162188
"PostgreSQLSSLConfig",
189+
"clear_postgresql_settings_cache",
190+
"get_postgresql_settings",
163191
]
164192
except ImportError:
165193
pass
@@ -170,47 +198,6 @@
170198
__email__ = "danieldcsta@gmail.com>"
171199
__license__ = "MIT"
172200
__copyright__ = "Copyright 2024-present DDC Softwares"
173-
_req_python_version = (3, 12, 0)
174-
175-
176-
try:
177-
_version = tuple(int(x) for x in version(__title__).split("."))
178-
except ModuleNotFoundError:
179-
_version = (0, 0, 0)
180-
181-
182-
class VersionInfo(NamedTuple):
183-
major: int
184-
minor: int
185-
micro: int
186-
releaselevel: Literal["alpha", "beta", "candidate", "final"]
187-
serial: int
188-
189-
190-
__version__ = _version
191-
__version_info__: VersionInfo = VersionInfo(
192-
major=__version__[0],
193-
minor=__version__[1],
194-
micro=__version__[2],
195-
releaselevel="final",
196-
serial=0,
197-
)
198-
__req_python_version__: VersionInfo = VersionInfo(
199-
major=_req_python_version[0],
200-
minor=_req_python_version[1],
201-
micro=_req_python_version[2],
202-
releaselevel="final",
203-
serial=0,
204-
)
201+
__version__ = version(__title__)
205202

206203
logging.getLogger(__name__).addHandler(logging.NullHandler())
207-
208-
del (
209-
logging,
210-
NamedTuple,
211-
Literal,
212-
VersionInfo,
213-
version,
214-
_version,
215-
_req_python_version,
216-
)

ddcDatabases/core/base.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
from __future__ import annotations
22

3+
import logging
4+
import sqlalchemy as sa
35
from .configs import BaseOperationRetryConfig, BaseRetryConfig
46
from .retry import retry_operation, retry_operation_async
57
from abc import ABC, abstractmethod
68
from contextlib import AbstractAsyncContextManager, AbstractContextManager
79
from datetime import datetime
8-
import logging
9-
import sqlalchemy as sa
1010
from sqlalchemy.engine import URL, Engine
1111
from sqlalchemy.ext.asyncio import AsyncEngine, AsyncSession, async_sessionmaker
1212
from sqlalchemy.orm import Session, sessionmaker

ddcDatabases/core/exceptions.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
from datetime import datetime, timezone
21
import logging
2+
from datetime import datetime, timezone
33
from typing import Any
44

55
_logger = logging.getLogger(__name__)

ddcDatabases/core/operations.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
from __future__ import annotations
22

3+
import logging
4+
import sqlalchemy as sa
35
from .configs import BaseOperationRetryConfig
46
from .exceptions import (
57
DBDeleteAllDataException,
@@ -10,8 +12,6 @@
1012
DBInsertSingleException,
1113
)
1214
from .retry import retry_operation, retry_operation_async
13-
import logging
14-
import sqlalchemy as sa
1515
from sqlalchemy import RowMapping
1616
from sqlalchemy.ext.asyncio import AsyncSession
1717
from sqlalchemy.orm import Session

ddcDatabases/core/persistent.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,11 @@
88

99
from __future__ import annotations
1010

11+
import asyncio
12+
import logging
13+
import threading
14+
import time
15+
import weakref
1116
from .configs import BaseRetryConfig
1217
from .retry import retry_operation, retry_operation_async
1318
from .settings import (
@@ -18,18 +23,13 @@
1823
get_postgresql_settings,
1924
)
2025
from abc import ABC, abstractmethod
21-
import asyncio
2226
from dataclasses import dataclass
23-
import logging
2427
from sqlalchemy import text
2528
from sqlalchemy.engine import URL, Engine, create_engine
2629
from sqlalchemy.exc import SQLAlchemyError
2730
from sqlalchemy.ext.asyncio import AsyncEngine, AsyncSession, create_async_engine
2831
from sqlalchemy.orm import Session, sessionmaker
29-
import threading
30-
import time
3132
from typing import Any, Generic, TypeVar, cast
32-
import weakref
3333

3434
_logger = logging.getLogger(__name__)
3535
_logger.addHandler(logging.NullHandler())

ddcDatabases/core/retry.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
from __future__ import annotations
22

3-
from .configs import BaseRetryConfig
4-
from .constants import CONNECTION_ERROR_KEYWORDS
53
import asyncio
64
import logging
75
import random
86
import time
7+
from .configs import BaseRetryConfig
8+
from .constants import CONNECTION_ERROR_KEYWORDS
99
from typing import Awaitable, Callable, TypeVar
1010

1111
# Type variable for generic return types

ddcDatabases/core/settings.py

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -275,3 +275,46 @@ class OracleSettings(_BaseDBSettings):
275275
get_mysql_settings = _create_cached_settings_factory(MySQLSettings)
276276
get_mongodb_settings = _create_cached_settings_factory(MongoDBSettings)
277277
get_oracle_settings = _create_cached_settings_factory(OracleSettings)
278+
279+
280+
def _clear_settings_cache(getter_func: Callable[[], T], reload_env: bool = True) -> None:
281+
"""Clear the cache for a settings getter function.
282+
283+
Args:
284+
getter_func: The cached getter function to clear
285+
reload_env: If True, also reset dotenv loaded flag to reload on next access
286+
"""
287+
global _dotenv_loaded
288+
getter_func.cache_clear() # type: ignore[attr-defined]
289+
if reload_env:
290+
_dotenv_loaded = False
291+
292+
293+
def clear_sqlite_settings_cache(reload_env: bool = True) -> None:
294+
"""Clear SQLite settings cache. Next call to get_sqlite_settings() will create fresh instance."""
295+
_clear_settings_cache(get_sqlite_settings, reload_env)
296+
297+
298+
def clear_postgresql_settings_cache(reload_env: bool = True) -> None:
299+
"""Clear PostgreSQL settings cache. Next call to get_postgresql_settings() will create fresh instance."""
300+
_clear_settings_cache(get_postgresql_settings, reload_env)
301+
302+
303+
def clear_mssql_settings_cache(reload_env: bool = True) -> None:
304+
"""Clear MSSQL settings cache. Next call to get_mssql_settings() will create fresh instance."""
305+
_clear_settings_cache(get_mssql_settings, reload_env)
306+
307+
308+
def clear_mysql_settings_cache(reload_env: bool = True) -> None:
309+
"""Clear MySQL settings cache. Next call to get_mysql_settings() will create fresh instance."""
310+
_clear_settings_cache(get_mysql_settings, reload_env)
311+
312+
313+
def clear_mongodb_settings_cache(reload_env: bool = True) -> None:
314+
"""Clear MongoDB settings cache. Next call to get_mongodb_settings() will create fresh instance."""
315+
_clear_settings_cache(get_mongodb_settings, reload_env)
316+
317+
318+
def clear_oracle_settings_cache(reload_env: bool = True) -> None:
319+
"""Clear Oracle settings cache. Next call to get_oracle_settings() will create fresh instance."""
320+
_clear_settings_cache(get_oracle_settings, reload_env)

ddcDatabases/mongodb.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
1+
import logging
2+
import sys
13
from .core.configs import BaseConnectionConfig, BaseOperationRetryConfig, BaseRetryConfig
24
from .core.retry import retry_operation, retry_operation_async
35
from .core.settings import get_mongodb_settings
46
from dataclasses import dataclass
5-
import logging
67
from motor.motor_asyncio import AsyncIOMotorClient, AsyncIOMotorCursor
78
from pymongo import ASCENDING, DESCENDING, MongoClient
89
from pymongo.cursor import Cursor
910
from pymongo.errors import PyMongoError
10-
import sys
1111
from typing import Any
1212

1313
_logger = logging.getLogger(__name__)

ddcDatabases/mssql.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import logging
12
from .core.base import BaseConnection, ConnectionTester
23
from .core.configs import (
34
BaseConnectionConfig,
@@ -9,7 +10,6 @@
910
from .core.settings import get_mssql_settings
1011
from contextlib import asynccontextmanager, contextmanager
1112
from dataclasses import dataclass
12-
import logging
1313
from sqlalchemy.engine import URL, Engine, create_engine
1414
from sqlalchemy.ext.asyncio import AsyncEngine, AsyncSession, create_async_engine
1515
from sqlalchemy.orm import Session

ddcDatabases/mysql.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import logging
12
from .core.base import BaseConnection
23
from .core.configs import (
34
BaseConnectionConfig,
@@ -11,7 +12,6 @@
1112
from .core.settings import get_mysql_settings
1213
from contextlib import asynccontextmanager, contextmanager
1314
from dataclasses import dataclass
14-
import logging
1515
from sqlalchemy.engine import URL, Engine, create_engine
1616
from sqlalchemy.ext.asyncio import AsyncEngine, create_async_engine
1717
from typing import Any, AsyncGenerator, Generator

0 commit comments

Comments
 (0)