diff --git a/pyathena/aio/sqlalchemy/base.py b/pyathena/aio/sqlalchemy/base.py index f2023ba4..42d69e4c 100644 --- a/pyathena/aio/sqlalchemy/base.py +++ b/pyathena/aio/sqlalchemy/base.py @@ -93,6 +93,9 @@ def fetchall(self) -> Any: def setinputsizes(self, sizes: Any) -> None: self._cursor.setinputsizes(sizes) + async def _async_soft_close(self) -> None: + return + # PyAthena-specific methods used by AthenaDialect reflection def list_databases(self, *args: Any, **kwargs: Any) -> Any: return await_only(self._cursor.list_databases(*args, **kwargs)) @@ -122,11 +125,11 @@ class AsyncAdapt_pyathena_connection(AdaptedConnection): # noqa: N801 - follows def __init__(self, dbapi: "AsyncAdapt_pyathena_dbapi", connection: AioConnection) -> None: self.dbapi = dbapi - self._connection = connection + self._connection = connection # type: ignore[assignment] @property def driver_connection(self) -> AioConnection: - return self._connection # type: ignore[no-any-return] + return self._connection # type: ignore[return-value] @property def catalog_name(self) -> Optional[str]: @@ -144,7 +147,7 @@ def close(self) -> None: self._connection.close() def commit(self) -> None: - self._connection.commit() + self._connection.commit() # type: ignore[unused-coroutine] def rollback(self) -> None: pass diff --git a/pyathena/sqlalchemy/compiler.py b/pyathena/sqlalchemy/compiler.py index 0501426b..d3168fdb 100644 --- a/pyathena/sqlalchemy/compiler.py +++ b/pyathena/sqlalchemy/compiler.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- from __future__ import annotations -from typing import TYPE_CHECKING, Any, Dict, List, Optional, Tuple, Type, Union, cast +from typing import TYPE_CHECKING, Any, Dict, List, Mapping, Optional, Tuple, Union, cast from sqlalchemy import exc, types, util from sqlalchemy.sql.compiler import ( @@ -31,12 +31,12 @@ UniqueConstraint, ) from sqlalchemy.sql.ddl import CreateTable - from sqlalchemy.sql.elements import FunctionElement + from sqlalchemy.sql.functions import Function from sqlalchemy.sql.selectable import GenerativeSelect from pyathena.sqlalchemy.base import AthenaDialect - _DialectArgDict = Dict[str, Any] + _DialectArgDict = Mapping[str, Any] CreateColumn = Any @@ -61,10 +61,10 @@ class AthenaTypeCompiler(GenericTypeCompiler): https://docs.aws.amazon.com/athena/latest/ug/data-types.html """ - def visit_FLOAT(self, type_: Type[Any], **kw) -> str: # noqa: N802 - return self.visit_REAL(type_, **kw) + def visit_FLOAT(self, type_: types.Float[Any], **kw: Any) -> str: # noqa: N802 + return self.visit_REAL(type_, **kw) # type: ignore[arg-type] - def visit_REAL(self, type_: Type[Any], **kw) -> str: # noqa: N802 + def visit_REAL(self, type_: types.REAL[Any], **kw: Any) -> str: # noqa: N802 return "FLOAT" def visit_DOUBLE(self, type_, **kw) -> str: # noqa: N802 @@ -73,78 +73,78 @@ def visit_DOUBLE(self, type_, **kw) -> str: # noqa: N802 def visit_DOUBLE_PRECISION(self, type_, **kw) -> str: # noqa: N802 return "DOUBLE" - def visit_NUMERIC(self, type_: Type[Any], **kw) -> str: # noqa: N802 - return self.visit_DECIMAL(type_, **kw) + def visit_NUMERIC(self, type_: types.Numeric[Any], **kw: Any) -> str: # noqa: N802 + return self.visit_DECIMAL(type_, **kw) # type: ignore[arg-type] - def visit_DECIMAL(self, type_: Type[Any], **kw) -> str: # noqa: N802 + def visit_DECIMAL(self, type_: types.DECIMAL[Any], **kw: Any) -> str: # noqa: N802 if type_.precision is None: return "DECIMAL" if type_.scale is None: return f"DECIMAL({type_.precision})" return f"DECIMAL({type_.precision}, {type_.scale})" - def visit_TINYINT(self, type_: Type[Any], **kw) -> str: # noqa: N802 + def visit_TINYINT(self, type_: types.Integer, **kw: Any) -> str: # noqa: N802 return "TINYINT" - def visit_INTEGER(self, type_: Type[Any], **kw) -> str: # noqa: N802 + def visit_INTEGER(self, type_: types.Integer, **kw: Any) -> str: # noqa: N802 return "INTEGER" - def visit_SMALLINT(self, type_: Type[Any], **kw) -> str: # noqa: N802 + def visit_SMALLINT(self, type_: types.SmallInteger, **kw: Any) -> str: # noqa: N802 return "SMALLINT" - def visit_BIGINT(self, type_: Type[Any], **kw) -> str: # noqa: N802 + def visit_BIGINT(self, type_: types.BigInteger, **kw: Any) -> str: # noqa: N802 return "BIGINT" - def visit_TIMESTAMP(self, type_: Type[Any], **kw) -> str: # noqa: N802 + def visit_TIMESTAMP(self, type_: types.TIMESTAMP, **kw: Any) -> str: # noqa: N802 return "TIMESTAMP" - def visit_DATETIME(self, type_: Type[Any], **kw) -> str: # noqa: N802 - return self.visit_TIMESTAMP(type_, **kw) + def visit_DATETIME(self, type_: types.DateTime, **kw: Any) -> str: # noqa: N802 + return self.visit_TIMESTAMP(type_, **kw) # type: ignore[arg-type] - def visit_DATE(self, type_: Type[Any], **kw) -> str: # noqa: N802 + def visit_DATE(self, type_: types.Date, **kw: Any) -> str: # noqa: N802 return "DATE" - def visit_TIME(self, type_: Type[Any], **kw) -> str: # noqa: N802 + def visit_TIME(self, type_: types.Time, **kw: Any) -> str: # noqa: N802 raise exc.CompileError(f"Data type `{type_}` is not supported") - def visit_CLOB(self, type_: Type[Any], **kw) -> str: # noqa: N802 - return self.visit_BINARY(type_, **kw) + def visit_CLOB(self, type_: types.CLOB, **kw: Any) -> str: # noqa: N802 + return self.visit_BINARY(type_, **kw) # type: ignore[arg-type] - def visit_NCLOB(self, type_: Type[Any], **kw) -> str: # noqa: N802 - return self.visit_BINARY(type_, **kw) + def visit_NCLOB(self, type_: types.Text, **kw: Any) -> str: # noqa: N802 + return self.visit_BINARY(type_, **kw) # type: ignore[arg-type] - def visit_CHAR(self, type_: Type[Any], **kw) -> str: # noqa: N802 + def visit_CHAR(self, type_: types.CHAR, **kw: Any) -> str: # noqa: N802 if type_.length: - return cast(str, self._render_string_type(type_, "CHAR")) + return self._render_string_type("CHAR", type_.length, type_.collation) return "STRING" - def visit_NCHAR(self, type_: Type[Any], **kw) -> str: # noqa: N802 - return self.visit_CHAR(type_, **kw) + def visit_NCHAR(self, type_: types.NCHAR, **kw: Any) -> str: # noqa: N802 + return self.visit_CHAR(type_, **kw) # type: ignore[arg-type] - def visit_VARCHAR(self, type_: Type[Any], **kw) -> str: # noqa: N802 + def visit_VARCHAR(self, type_: types.String, **kw: Any) -> str: # noqa: N802 if type_.length: - return cast(str, self._render_string_type(type_, "VARCHAR")) + return self._render_string_type("VARCHAR", type_.length, type_.collation) return "STRING" - def visit_NVARCHAR(self, type_: Type[Any], **kw) -> str: # noqa: N802 - return self.visit_VARCHAR(type_, **kw) + def visit_NVARCHAR(self, type_: types.NVARCHAR, **kw: Any) -> str: # noqa: N802 + return self.visit_VARCHAR(type_, **kw) # type: ignore[arg-type] - def visit_TEXT(self, type_: Type[Any], **kw) -> str: # noqa: N802 + def visit_TEXT(self, type_: types.Text, **kw: Any) -> str: # noqa: N802 return "STRING" - def visit_BLOB(self, type_: Type[Any], **kw) -> str: # noqa: N802 - return self.visit_BINARY(type_, **kw) + def visit_BLOB(self, type_: types.LargeBinary, **kw: Any) -> str: # noqa: N802 + return self.visit_BINARY(type_, **kw) # type: ignore[arg-type] - def visit_BINARY(self, type_: Type[Any], **kw) -> str: # noqa: N802 + def visit_BINARY(self, type_: types.BINARY, **kw: Any) -> str: # noqa: N802 return "BINARY" - def visit_VARBINARY(self, type_: Type[Any], **kw) -> str: # noqa: N802 - return self.visit_BINARY(type_, **kw) + def visit_VARBINARY(self, type_: types.VARBINARY, **kw: Any) -> str: # noqa: N802 + return self.visit_BINARY(type_, **kw) # type: ignore[arg-type] - def visit_BOOLEAN(self, type_: Type[Any], **kw) -> str: # noqa: N802 + def visit_BOOLEAN(self, type_: types.Boolean, **kw: Any) -> str: # noqa: N802 return "BOOLEAN" - def visit_JSON(self, type_: Type[Any], **kw) -> str: # noqa: N802 + def visit_JSON(self, type_: types.JSON, **kw: Any) -> str: # noqa: N802 return "JSON" def visit_string(self, type_, **kw): # noqa: N802 @@ -219,10 +219,10 @@ class AthenaStatementCompiler(SQLCompiler): https://docs.aws.amazon.com/athena/latest/ug/ddl-sql-reference.html """ - def visit_char_length_func(self, fn: "FunctionElement[Any]", **kw): + def visit_char_length_func(self, fn: "Function[Any]", **kw: Any) -> str: return f"length{self.function_argspec(fn, **kw)}" - def visit_filter_func(self, fn: "FunctionElement[Any]", **kw) -> str: + def visit_filter_func(self, fn: "Function[Any]", **kw: Any) -> str: """Compile Athena filter() function with lambda expressions. Supports syntax: filter(array_expr, lambda_expr) @@ -370,7 +370,7 @@ def _get_comment_specification(self, comment: str) -> str: return f"COMMENT {self._escape_comment(comment)}" def _get_bucket_count( - self, dialect_opts: "_DialectArgDict", connect_opts: Dict[str, Any] + self, dialect_opts: "_DialectArgDict", connect_opts: Mapping[str, Any] ) -> Optional[str]: if dialect_opts["bucket_count"]: bucket_count = dialect_opts["bucket_count"] @@ -381,7 +381,7 @@ def _get_bucket_count( return cast(str, bucket_count) if bucket_count is not None else None def _get_file_format( - self, dialect_opts: "_DialectArgDict", connect_opts: Dict[str, Any] + self, dialect_opts: "_DialectArgDict", connect_opts: Mapping[str, Any] ) -> Optional[str]: if dialect_opts["file_format"]: file_format = dialect_opts["file_format"] @@ -392,7 +392,7 @@ def _get_file_format( return cast(Optional[str], file_format) def _get_file_format_specification( - self, dialect_opts: "_DialectArgDict", connect_opts: Dict[str, Any] + self, dialect_opts: "_DialectArgDict", connect_opts: Mapping[str, Any] ) -> str: file_format = self._get_file_format(dialect_opts, connect_opts) text = [] @@ -401,7 +401,7 @@ def _get_file_format_specification( return "\n".join(text) def _get_row_format( - self, dialect_opts: "_DialectArgDict", connect_opts: Dict[str, Any] + self, dialect_opts: "_DialectArgDict", connect_opts: Mapping[str, Any] ) -> Optional[str]: if dialect_opts["row_format"]: row_format = dialect_opts["row_format"] @@ -412,7 +412,7 @@ def _get_row_format( return cast(Optional[str], row_format) def _get_row_format_specification( - self, dialect_opts: "_DialectArgDict", connect_opts: Dict[str, Any] + self, dialect_opts: "_DialectArgDict", connect_opts: Mapping[str, Any] ) -> str: row_format = self._get_row_format(dialect_opts, connect_opts) text = [] @@ -421,7 +421,7 @@ def _get_row_format_specification( return "\n".join(text) def _get_serde_properties( - self, dialect_opts: "_DialectArgDict", connect_opts: Dict[str, Any] + self, dialect_opts: "_DialectArgDict", connect_opts: Mapping[str, Any] ) -> Optional[Union[str, Dict[str, Any]]]: if dialect_opts["serdeproperties"]: serde_properties = dialect_opts["serdeproperties"] @@ -432,7 +432,7 @@ def _get_serde_properties( return cast(Optional[str], serde_properties) def _get_serde_properties_specification( - self, dialect_opts: "_DialectArgDict", connect_opts: Dict[str, Any] + self, dialect_opts: "_DialectArgDict", connect_opts: Mapping[str, Any] ) -> str: serde_properties = self._get_serde_properties(dialect_opts, connect_opts) text = [] @@ -446,7 +446,7 @@ def _get_serde_properties_specification( return "\n".join(text) def _get_table_location( - self, table: "Table", dialect_opts: "_DialectArgDict", connect_opts: Dict[str, Any] + self, table: "Table", dialect_opts: "_DialectArgDict", connect_opts: Mapping[str, Any] ) -> Optional[str]: if dialect_opts["location"]: location = cast(str, dialect_opts["location"]) @@ -464,7 +464,7 @@ def _get_table_location( return location def _get_table_location_specification( - self, table: "Table", dialect_opts: "_DialectArgDict", connect_opts: Dict[str, Any] + self, table: "Table", dialect_opts: "_DialectArgDict", connect_opts: Mapping[str, Any] ) -> str: location = self._get_table_location(table, dialect_opts, connect_opts) text = [] @@ -482,7 +482,7 @@ def _get_table_location_specification( return "\n".join(text) def _get_table_properties( - self, dialect_opts: "_DialectArgDict", connect_opts: Dict[str, Any] + self, dialect_opts: "_DialectArgDict", connect_opts: Mapping[str, Any] ) -> Optional[Union[Dict[str, str], str]]: if dialect_opts["tblproperties"]: table_properties = cast(str, dialect_opts["tblproperties"]) @@ -493,7 +493,7 @@ def _get_table_properties( return table_properties def _get_compression( - self, dialect_opts: "_DialectArgDict", connect_opts: Dict[str, Any] + self, dialect_opts: "_DialectArgDict", connect_opts: Mapping[str, Any] ) -> Optional[str]: if dialect_opts["compression"]: compression = cast(str, dialect_opts["compression"]) @@ -504,7 +504,7 @@ def _get_compression( return compression def _get_table_properties_specification( - self, dialect_opts: "_DialectArgDict", connect_opts: Dict[str, Any] + self, dialect_opts: "_DialectArgDict", connect_opts: Mapping[str, Any] ) -> str: properties = self._get_table_properties(dialect_opts, connect_opts) if properties: @@ -554,26 +554,22 @@ def get_column_specification(self, column: "Column[Any]", **kwargs) -> str: text.append(f"{self._get_comment_specification(column.comment)}") return " ".join(text) - def visit_check_constraint(self, constraint: "CheckConstraint", **kw) -> Optional[str]: - return None + def visit_check_constraint(self, constraint: "CheckConstraint", **kw: Any) -> str: + return "" - def visit_column_check_constraint(self, constraint: "CheckConstraint", **kw) -> Optional[str]: - return None + def visit_column_check_constraint(self, constraint: "CheckConstraint", **kw: Any) -> str: + return "" - def visit_foreign_key_constraint( - self, constraint: "ForeignKeyConstraint", **kw - ) -> Optional[str]: - return None + def visit_foreign_key_constraint(self, constraint: "ForeignKeyConstraint", **kw: Any) -> str: + return "" - def visit_primary_key_constraint( - self, constraint: "PrimaryKeyConstraint", **kw - ) -> Optional[str]: - return None + def visit_primary_key_constraint(self, constraint: "PrimaryKeyConstraint", **kw: Any) -> str: + return "" - def visit_unique_constraint(self, constraint: "UniqueConstraint", **kw) -> Optional[str]: - return None + def visit_unique_constraint(self, constraint: "UniqueConstraint", **kw: Any) -> str: + return "" - def _get_connect_option_partitions(self, connect_opts: Dict[str, Any]) -> List[str]: + def _get_connect_option_partitions(self, connect_opts: Mapping[str, Any]) -> List[str]: if connect_opts: partition = cast(str, connect_opts.get("partition")) partitions = partition.split(",") if partition else [] @@ -581,7 +577,7 @@ def _get_connect_option_partitions(self, connect_opts: Dict[str, Any]) -> List[s partitions = [] return partitions - def _get_connect_option_buckets(self, connect_opts: Dict[str, Any]) -> List[str]: + def _get_connect_option_buckets(self, connect_opts: Mapping[str, Any]) -> List[str]: if connect_opts: bucket = cast(str, connect_opts.get("cluster")) buckets = bucket.split(",") if bucket else [] @@ -624,7 +620,7 @@ def _prepared_columns( table: "Table", is_iceberg: bool, create_columns: List["CreateColumn"], - connect_opts: Dict[str, Any], + connect_opts: Mapping[str, Any], ) -> Tuple[List[str], List[str], List[str]]: columns, partitions, buckets = [], [], [] conn_partitions = self._get_connect_option_partitions(connect_opts) diff --git a/tests/sqlalchemy/test_suite.py b/tests/sqlalchemy/test_suite.py index 097f0cf0..1e2c59bc 100644 --- a/tests/sqlalchemy/test_suite.py +++ b/tests/sqlalchemy/test_suite.py @@ -9,7 +9,6 @@ from sqlalchemy.testing.suite import TrueDivTest as _TrueDivTest del BinaryTest # noqa -del BizarroCharacterFKResolutionTest # noqa del ComponentReflectionTest # noqa del ComponentReflectionTestExtra # noqa del CompositeKeyReflectionTest # noqa diff --git a/uv.lock b/uv.lock index cf663da4..e4ca3ef6 100644 --- a/uv.lock +++ b/uv.lock @@ -1531,47 +1531,58 @@ wheels = [ [[package]] name = "sqlalchemy" -version = "2.0.36" +version = "2.0.46" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "greenlet", marker = "(python_full_version < '3.13' and platform_machine == 'AMD64') or (python_full_version < '3.13' and platform_machine == 'WIN32') or (python_full_version < '3.13' and platform_machine == 'aarch64') or (python_full_version < '3.13' and platform_machine == 'amd64') or (python_full_version < '3.13' and platform_machine == 'ppc64le') or (python_full_version < '3.13' and platform_machine == 'win32') or (python_full_version < '3.13' and platform_machine == 'x86_64')" }, + { name = "greenlet", marker = "platform_machine == 'AMD64' or platform_machine == 'WIN32' or platform_machine == 'aarch64' or platform_machine == 'amd64' or platform_machine == 'ppc64le' or platform_machine == 'win32' or platform_machine == 'x86_64'" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/50/65/9cbc9c4c3287bed2499e05033e207473504dc4df999ce49385fb1f8b058a/sqlalchemy-2.0.36.tar.gz", hash = "sha256:7f2767680b6d2398aea7082e45a774b2b0767b5c8d8ffb9c8b683088ea9b29c5", size = 9574485, upload-time = "2024-10-15T19:41:44.446Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/db/72/14ab694b8b3f0e35ef5beb74a8fea2811aa791ba1611c44dc90cdf46af17/SQLAlchemy-2.0.36-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:59b8f3adb3971929a3e660337f5dacc5942c2cdb760afcabb2614ffbda9f9f72", size = 2092604, upload-time = "2024-10-16T00:41:22.511Z" }, - { url = "https://files.pythonhosted.org/packages/1e/59/333fcbca58b79f5b8b61853d6137530198823392151fa8fd9425f367519e/SQLAlchemy-2.0.36-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:37350015056a553e442ff672c2d20e6f4b6d0b2495691fa239d8aa18bb3bc908", size = 2083796, upload-time = "2024-10-16T00:41:26.005Z" }, - { url = "https://files.pythonhosted.org/packages/6c/a0/ec3c188d2b0c1bc742262e76408d44104598d7247c23f5b06bb97ee21bfa/SQLAlchemy-2.0.36-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8318f4776c85abc3f40ab185e388bee7a6ea99e7fa3a30686580b209eaa35c08", size = 3066165, upload-time = "2024-10-15T21:40:59.696Z" }, - { url = "https://files.pythonhosted.org/packages/07/15/68ef91de5b8b7f80fb2d2b3b31ed42180c6227fe0a701aed9d01d34f98ec/SQLAlchemy-2.0.36-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c245b1fbade9c35e5bd3b64270ab49ce990369018289ecfde3f9c318411aaa07", size = 3074428, upload-time = "2024-10-15T20:03:35.39Z" }, - { url = "https://files.pythonhosted.org/packages/e2/4c/9dfea5e63b87325eef6d9cdaac913459aa6a157a05a05ea6ff20004aee8e/SQLAlchemy-2.0.36-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:69f93723edbca7342624d09f6704e7126b152eaed3cdbb634cb657a54332a3c5", size = 3030477, upload-time = "2024-10-15T21:41:03.437Z" }, - { url = "https://files.pythonhosted.org/packages/16/a5/fcfde8e74ea5f683b24add22463bfc21e431d4a5531c8a5b55bc6fbea164/SQLAlchemy-2.0.36-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f9511d8dd4a6e9271d07d150fb2f81874a3c8c95e11ff9af3a2dfc35fe42ee44", size = 3055942, upload-time = "2024-10-15T20:03:38.576Z" }, - { url = "https://files.pythonhosted.org/packages/3c/ee/c22c415a771d791ae99146d72ffdb20e43625acd24835ea7fc157436d59f/SQLAlchemy-2.0.36-cp310-cp310-win32.whl", hash = "sha256:c3f3631693003d8e585d4200730616b78fafd5a01ef8b698f6967da5c605b3fa", size = 2064960, upload-time = "2024-10-15T20:07:17.401Z" }, - { url = "https://files.pythonhosted.org/packages/aa/af/ad9c25cadc79bd851bdb9d82b68af9bdb91ff05f56d0da2f8a654825974f/SQLAlchemy-2.0.36-cp310-cp310-win_amd64.whl", hash = "sha256:a86bfab2ef46d63300c0f06936bd6e6c0105faa11d509083ba8f2f9d237fb5b5", size = 2089078, upload-time = "2024-10-15T20:07:19Z" }, - { url = "https://files.pythonhosted.org/packages/00/4e/5a67963fd7cbc1beb8bd2152e907419f4c940ef04600b10151a751fe9e06/SQLAlchemy-2.0.36-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:fd3a55deef00f689ce931d4d1b23fa9f04c880a48ee97af488fd215cf24e2a6c", size = 2093782, upload-time = "2024-10-16T00:41:28.675Z" }, - { url = "https://files.pythonhosted.org/packages/b3/24/30e33b6389ebb5a17df2a4243b091bc709fb3dfc9a48c8d72f8e037c943d/SQLAlchemy-2.0.36-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4f5e9cd989b45b73bd359f693b935364f7e1f79486e29015813c338450aa5a71", size = 2084180, upload-time = "2024-10-16T00:41:30.374Z" }, - { url = "https://files.pythonhosted.org/packages/10/1e/70e9ed2143a27065246be40f78637ad5160ea0f5fd32f8cab819a31ff54d/SQLAlchemy-2.0.36-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0ddd9db6e59c44875211bc4c7953a9f6638b937b0a88ae6d09eb46cced54eff", size = 3202469, upload-time = "2024-10-15T21:41:05.807Z" }, - { url = "https://files.pythonhosted.org/packages/b4/5f/95e0ed74093ac3c0db6acfa944d4d8ac6284ef5e1136b878a327ea1f975a/SQLAlchemy-2.0.36-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2519f3a5d0517fc159afab1015e54bb81b4406c278749779be57a569d8d1bb0d", size = 3202464, upload-time = "2024-10-15T20:03:40.532Z" }, - { url = "https://files.pythonhosted.org/packages/91/95/2cf9b85a6bc2ee660e40594dffe04e777e7b8617fd0c6d77a0f782ea96c9/SQLAlchemy-2.0.36-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:59b1ee96617135f6e1d6f275bbe988f419c5178016f3d41d3c0abb0c819f75bb", size = 3139508, upload-time = "2024-10-15T21:41:07.508Z" }, - { url = "https://files.pythonhosted.org/packages/92/ea/f0c01bc646456e4345c0fb5a3ddef457326285c2dc60435b0eb96b61bf31/SQLAlchemy-2.0.36-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:39769a115f730d683b0eb7b694db9789267bcd027326cccc3125e862eb03bfd8", size = 3159837, upload-time = "2024-10-15T20:03:42.578Z" }, - { url = "https://files.pythonhosted.org/packages/a6/93/c8edbf153ee38fe529773240877bf1332ed95328aceef6254288f446994e/SQLAlchemy-2.0.36-cp311-cp311-win32.whl", hash = "sha256:66bffbad8d6271bb1cc2f9a4ea4f86f80fe5e2e3e501a5ae2a3dc6a76e604e6f", size = 2064529, upload-time = "2024-10-15T20:07:21.129Z" }, - { url = "https://files.pythonhosted.org/packages/b1/03/d12b7c1d36fd80150c1d52e121614cf9377dac99e5497af8d8f5b2a8db64/SQLAlchemy-2.0.36-cp311-cp311-win_amd64.whl", hash = "sha256:23623166bfefe1487d81b698c423f8678e80df8b54614c2bf4b4cfcd7c711959", size = 2089874, upload-time = "2024-10-15T20:07:22.477Z" }, - { url = "https://files.pythonhosted.org/packages/b8/bf/005dc47f0e57556e14512d5542f3f183b94fde46e15ff1588ec58ca89555/SQLAlchemy-2.0.36-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f7b64e6ec3f02c35647be6b4851008b26cff592a95ecb13b6788a54ef80bbdd4", size = 2092378, upload-time = "2024-10-16T00:43:55.469Z" }, - { url = "https://files.pythonhosted.org/packages/94/65/f109d5720779a08e6e324ec89a744f5f92c48bd8005edc814bf72fbb24e5/SQLAlchemy-2.0.36-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:46331b00096a6db1fdc052d55b101dbbfc99155a548e20a0e4a8e5e4d1362855", size = 2082778, upload-time = "2024-10-16T00:43:57.304Z" }, - { url = "https://files.pythonhosted.org/packages/60/f6/d9aa8c49c44f9b8c9b9dada1f12fa78df3d4c42aa2de437164b83ee1123c/SQLAlchemy-2.0.36-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fdf3386a801ea5aba17c6410dd1dc8d39cf454ca2565541b5ac42a84e1e28f53", size = 3232191, upload-time = "2024-10-15T21:31:12.896Z" }, - { url = "https://files.pythonhosted.org/packages/8a/ab/81d4514527c068670cb1d7ab62a81a185df53a7c379bd2a5636e83d09ede/SQLAlchemy-2.0.36-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac9dfa18ff2a67b09b372d5db8743c27966abf0e5344c555d86cc7199f7ad83a", size = 3243044, upload-time = "2024-10-15T20:16:28.954Z" }, - { url = "https://files.pythonhosted.org/packages/35/b4/f87c014ecf5167dc669199cafdb20a7358ff4b1d49ce3622cc48571f811c/SQLAlchemy-2.0.36-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:90812a8933df713fdf748b355527e3af257a11e415b613dd794512461eb8a686", size = 3178511, upload-time = "2024-10-15T21:31:16.792Z" }, - { url = "https://files.pythonhosted.org/packages/ea/09/badfc9293bc3ccba6ede05e5f2b44a760aa47d84da1fc5a326e963e3d4d9/SQLAlchemy-2.0.36-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1bc330d9d29c7f06f003ab10e1eaced295e87940405afe1b110f2eb93a233588", size = 3205147, upload-time = "2024-10-15T20:16:32.718Z" }, - { url = "https://files.pythonhosted.org/packages/c8/60/70e681de02a13c4b27979b7b78da3058c49bacc9858c89ba672e030f03f2/SQLAlchemy-2.0.36-cp312-cp312-win32.whl", hash = "sha256:79d2e78abc26d871875b419e1fd3c0bca31a1cb0043277d0d850014599626c2e", size = 2062709, upload-time = "2024-10-15T20:16:29.946Z" }, - { url = "https://files.pythonhosted.org/packages/b7/ed/f6cd9395e41bfe47dd253d74d2dfc3cab34980d4e20c8878cb1117306085/SQLAlchemy-2.0.36-cp312-cp312-win_amd64.whl", hash = "sha256:b544ad1935a8541d177cb402948b94e871067656b3a0b9e91dbec136b06a2ff5", size = 2088433, upload-time = "2024-10-15T20:16:33.501Z" }, - { url = "https://files.pythonhosted.org/packages/78/5c/236398ae3678b3237726819b484f15f5c038a9549da01703a771f05a00d6/SQLAlchemy-2.0.36-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b5cc79df7f4bc3d11e4b542596c03826063092611e481fcf1c9dfee3c94355ef", size = 2087651, upload-time = "2024-10-16T00:43:59.168Z" }, - { url = "https://files.pythonhosted.org/packages/a8/14/55c47420c0d23fb67a35af8be4719199b81c59f3084c28d131a7767b0b0b/SQLAlchemy-2.0.36-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3c01117dd36800f2ecaa238c65365b7b16497adc1522bf84906e5710ee9ba0e8", size = 2078132, upload-time = "2024-10-16T00:44:01.279Z" }, - { url = "https://files.pythonhosted.org/packages/3d/97/1e843b36abff8c4a7aa2e37f9bea364f90d021754c2de94d792c2d91405b/SQLAlchemy-2.0.36-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9bc633f4ee4b4c46e7adcb3a9b5ec083bf1d9a97c1d3854b92749d935de40b9b", size = 3164559, upload-time = "2024-10-15T21:31:18.961Z" }, - { url = "https://files.pythonhosted.org/packages/7b/c5/07f18a897b997f6d6b234fab2bf31dccf66d5d16a79fe329aefc95cd7461/SQLAlchemy-2.0.36-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e46ed38affdfc95d2c958de328d037d87801cfcbea6d421000859e9789e61c2", size = 3177897, upload-time = "2024-10-15T20:16:35.048Z" }, - { url = "https://files.pythonhosted.org/packages/b3/cd/e16f3cbefd82b5c40b33732da634ec67a5f33b587744c7ab41699789d492/SQLAlchemy-2.0.36-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b2985c0b06e989c043f1dc09d4fe89e1616aadd35392aea2844f0458a989eacf", size = 3111289, upload-time = "2024-10-15T21:31:21.11Z" }, - { url = "https://files.pythonhosted.org/packages/15/85/5b8a3b0bc29c9928aa62b5c91fcc8335f57c1de0a6343873b5f372e3672b/SQLAlchemy-2.0.36-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4a121d62ebe7d26fec9155f83f8be5189ef1405f5973ea4874a26fab9f1e262c", size = 3139491, upload-time = "2024-10-15T20:16:38.048Z" }, - { url = "https://files.pythonhosted.org/packages/a1/95/81babb6089938680dfe2cd3f88cd3fd39cccd1543b7cb603b21ad881bff1/SQLAlchemy-2.0.36-cp313-cp313-win32.whl", hash = "sha256:0572f4bd6f94752167adfd7c1bed84f4b240ee6203a95e05d1e208d488d0d436", size = 2060439, upload-time = "2024-10-15T20:16:36.182Z" }, - { url = "https://files.pythonhosted.org/packages/c1/ce/5f7428df55660d6879d0522adc73a3364970b5ef33ec17fa125c5dbcac1d/SQLAlchemy-2.0.36-cp313-cp313-win_amd64.whl", hash = "sha256:8c78ac40bde930c60e0f78b3cd184c580f89456dd87fc08f9e3ee3ce8765ce88", size = 2084574, upload-time = "2024-10-15T20:16:38.686Z" }, - { url = "https://files.pythonhosted.org/packages/b8/49/21633706dd6feb14cd3f7935fc00b60870ea057686035e1a99ae6d9d9d53/SQLAlchemy-2.0.36-py3-none-any.whl", hash = "sha256:fddbe92b4760c6f5d48162aef14824add991aeda8ddadb3c31d56eb15ca69f8e", size = 1883787, upload-time = "2024-10-15T20:04:30.265Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/06/aa/9ce0f3e7a9829ead5c8ce549392f33a12c4555a6c0609bb27d882e9c7ddf/sqlalchemy-2.0.46.tar.gz", hash = "sha256:cf36851ee7219c170bb0793dbc3da3e80c582e04a5437bc601bfe8c85c9216d7", size = 9865393, upload-time = "2026-01-21T18:03:45.119Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/40/26/66ba59328dc25e523bfcb0f8db48bdebe2035e0159d600e1f01c0fc93967/sqlalchemy-2.0.46-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:895296687ad06dc9b11a024cf68e8d9d3943aa0b4964278d2553b86f1b267735", size = 2155051, upload-time = "2026-01-21T18:27:28.965Z" }, + { url = "https://files.pythonhosted.org/packages/21/cd/9336732941df972fbbfa394db9caa8bb0cf9fe03656ec728d12e9cbd6edc/sqlalchemy-2.0.46-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ab65cb2885a9f80f979b85aa4e9c9165a31381ca322cbde7c638fe6eefd1ec39", size = 3234666, upload-time = "2026-01-21T18:32:28.72Z" }, + { url = "https://files.pythonhosted.org/packages/38/62/865ae8b739930ec433cd4123760bee7f8dafdc10abefd725a025604fb0de/sqlalchemy-2.0.46-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:52fe29b3817bd191cc20bad564237c808967972c97fa683c04b28ec8979ae36f", size = 3232917, upload-time = "2026-01-21T18:44:54.064Z" }, + { url = "https://files.pythonhosted.org/packages/24/38/805904b911857f2b5e00fdea44e9570df62110f834378706939825579296/sqlalchemy-2.0.46-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:09168817d6c19954d3b7655da6ba87fcb3a62bb575fb396a81a8b6a9fadfe8b5", size = 3185790, upload-time = "2026-01-21T18:32:30.581Z" }, + { url = "https://files.pythonhosted.org/packages/69/4f/3260bb53aabd2d274856337456ea52f6a7eccf6cce208e558f870cec766b/sqlalchemy-2.0.46-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:be6c0466b4c25b44c5d82b0426b5501de3c424d7a3220e86cd32f319ba56798e", size = 3207206, upload-time = "2026-01-21T18:44:55.93Z" }, + { url = "https://files.pythonhosted.org/packages/ce/b3/67c432d7f9d88bb1a61909b67e29f6354d59186c168fb5d381cf438d3b73/sqlalchemy-2.0.46-cp310-cp310-win32.whl", hash = "sha256:1bc3f601f0a818d27bfe139f6766487d9c88502062a2cd3a7ee6c342e81d5047", size = 2115296, upload-time = "2026-01-21T18:33:12.498Z" }, + { url = "https://files.pythonhosted.org/packages/4a/8c/25fb284f570f9d48e6c240f0269a50cec9cf009a7e08be4c0aaaf0654972/sqlalchemy-2.0.46-cp310-cp310-win_amd64.whl", hash = "sha256:e0c05aff5c6b1bb5fb46a87e0f9d2f733f83ef6cbbbcd5c642b6c01678268061", size = 2138540, upload-time = "2026-01-21T18:33:14.22Z" }, + { url = "https://files.pythonhosted.org/packages/69/ac/b42ad16800d0885105b59380ad69aad0cce5a65276e269ce2729a2343b6a/sqlalchemy-2.0.46-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:261c4b1f101b4a411154f1da2b76497d73abbfc42740029205d4d01fa1052684", size = 2154851, upload-time = "2026-01-21T18:27:30.54Z" }, + { url = "https://files.pythonhosted.org/packages/a0/60/d8710068cb79f64d002ebed62a7263c00c8fd95f4ebd4b5be8f7ca93f2bc/sqlalchemy-2.0.46-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:181903fe8c1b9082995325f1b2e84ac078b1189e2819380c2303a5f90e114a62", size = 3311241, upload-time = "2026-01-21T18:32:33.45Z" }, + { url = "https://files.pythonhosted.org/packages/2b/0f/20c71487c7219ab3aa7421c7c62d93824c97c1460f2e8bb72404b0192d13/sqlalchemy-2.0.46-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:590be24e20e2424a4c3c1b0835e9405fa3d0af5823a1a9fc02e5dff56471515f", size = 3310741, upload-time = "2026-01-21T18:44:57.887Z" }, + { url = "https://files.pythonhosted.org/packages/65/80/d26d00b3b249ae000eee4db206fcfc564bf6ca5030e4747adf451f4b5108/sqlalchemy-2.0.46-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7568fe771f974abadce52669ef3a03150ff03186d8eb82613bc8adc435a03f01", size = 3263116, upload-time = "2026-01-21T18:32:35.044Z" }, + { url = "https://files.pythonhosted.org/packages/da/ee/74dda7506640923821340541e8e45bd3edd8df78664f1f2e0aae8077192b/sqlalchemy-2.0.46-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ebf7e1e78af38047e08836d33502c7a278915698b7c2145d045f780201679999", size = 3285327, upload-time = "2026-01-21T18:44:59.254Z" }, + { url = "https://files.pythonhosted.org/packages/9f/25/6dcf8abafff1389a21c7185364de145107b7394ecdcb05233815b236330d/sqlalchemy-2.0.46-cp311-cp311-win32.whl", hash = "sha256:9d80ea2ac519c364a7286e8d765d6cd08648f5b21ca855a8017d9871f075542d", size = 2114564, upload-time = "2026-01-21T18:33:15.85Z" }, + { url = "https://files.pythonhosted.org/packages/93/5f/e081490f8523adc0088f777e4ebad3cac21e498ec8a3d4067074e21447a1/sqlalchemy-2.0.46-cp311-cp311-win_amd64.whl", hash = "sha256:585af6afe518732d9ccd3aea33af2edaae4a7aa881af5d8f6f4fe3a368699597", size = 2139233, upload-time = "2026-01-21T18:33:17.528Z" }, + { url = "https://files.pythonhosted.org/packages/b6/35/d16bfa235c8b7caba3730bba43e20b1e376d2224f407c178fbf59559f23e/sqlalchemy-2.0.46-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3a9a72b0da8387f15d5810f1facca8f879de9b85af8c645138cba61ea147968c", size = 2153405, upload-time = "2026-01-21T19:05:54.143Z" }, + { url = "https://files.pythonhosted.org/packages/06/6c/3192e24486749862f495ddc6584ed730c0c994a67550ec395d872a2ad650/sqlalchemy-2.0.46-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2347c3f0efc4de367ba00218e0ae5c4ba2306e47216ef80d6e31761ac97cb0b9", size = 3334702, upload-time = "2026-01-21T18:46:45.384Z" }, + { url = "https://files.pythonhosted.org/packages/ea/a2/b9f33c8d68a3747d972a0bb758c6b63691f8fb8a49014bc3379ba15d4274/sqlalchemy-2.0.46-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9094c8b3197db12aa6f05c51c05daaad0a92b8c9af5388569847b03b1007fb1b", size = 3347664, upload-time = "2026-01-21T18:40:09.979Z" }, + { url = "https://files.pythonhosted.org/packages/aa/d2/3e59e2a91eaec9db7e8dc6b37b91489b5caeb054f670f32c95bcba98940f/sqlalchemy-2.0.46-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:37fee2164cf21417478b6a906adc1a91d69ae9aba8f9533e67ce882f4bb1de53", size = 3277372, upload-time = "2026-01-21T18:46:47.168Z" }, + { url = "https://files.pythonhosted.org/packages/dd/dd/67bc2e368b524e2192c3927b423798deda72c003e73a1e94c21e74b20a85/sqlalchemy-2.0.46-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b1e14b2f6965a685c7128bd315e27387205429c2e339eeec55cb75ca4ab0ea2e", size = 3312425, upload-time = "2026-01-21T18:40:11.548Z" }, + { url = "https://files.pythonhosted.org/packages/43/82/0ecd68e172bfe62247e96cb47867c2d68752566811a4e8c9d8f6e7c38a65/sqlalchemy-2.0.46-cp312-cp312-win32.whl", hash = "sha256:412f26bb4ba942d52016edc8d12fb15d91d3cd46b0047ba46e424213ad407bcb", size = 2113155, upload-time = "2026-01-21T18:42:49.748Z" }, + { url = "https://files.pythonhosted.org/packages/bc/2a/2821a45742073fc0331dc132552b30de68ba9563230853437cac54b2b53e/sqlalchemy-2.0.46-cp312-cp312-win_amd64.whl", hash = "sha256:ea3cd46b6713a10216323cda3333514944e510aa691c945334713fca6b5279ff", size = 2140078, upload-time = "2026-01-21T18:42:51.197Z" }, + { url = "https://files.pythonhosted.org/packages/b3/4b/fa7838fe20bb752810feed60e45625a9a8b0102c0c09971e2d1d95362992/sqlalchemy-2.0.46-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:93a12da97cca70cea10d4b4fc602589c4511f96c1f8f6c11817620c021d21d00", size = 2150268, upload-time = "2026-01-21T19:05:56.621Z" }, + { url = "https://files.pythonhosted.org/packages/46/c1/b34dccd712e8ea846edf396e00973dda82d598cb93762e55e43e6835eba9/sqlalchemy-2.0.46-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:af865c18752d416798dae13f83f38927c52f085c52e2f32b8ab0fef46fdd02c2", size = 3276511, upload-time = "2026-01-21T18:46:49.022Z" }, + { url = "https://files.pythonhosted.org/packages/96/48/a04d9c94753e5d5d096c628c82a98c4793b9c08ca0e7155c3eb7d7db9f24/sqlalchemy-2.0.46-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8d679b5f318423eacb61f933a9a0f75535bfca7056daeadbf6bd5bcee6183aee", size = 3292881, upload-time = "2026-01-21T18:40:13.089Z" }, + { url = "https://files.pythonhosted.org/packages/be/f4/06eda6e91476f90a7d8058f74311cb65a2fb68d988171aced81707189131/sqlalchemy-2.0.46-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:64901e08c33462acc9ec3bad27fc7a5c2b6491665f2aa57564e57a4f5d7c52ad", size = 3224559, upload-time = "2026-01-21T18:46:50.974Z" }, + { url = "https://files.pythonhosted.org/packages/ab/a2/d2af04095412ca6345ac22b33b89fe8d6f32a481e613ffcb2377d931d8d0/sqlalchemy-2.0.46-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e8ac45e8f4eaac0f9f8043ea0e224158855c6a4329fd4ee37c45c61e3beb518e", size = 3262728, upload-time = "2026-01-21T18:40:14.883Z" }, + { url = "https://files.pythonhosted.org/packages/31/48/1980c7caa5978a3b8225b4d230e69a2a6538a3562b8b31cea679b6933c83/sqlalchemy-2.0.46-cp313-cp313-win32.whl", hash = "sha256:8d3b44b3d0ab2f1319d71d9863d76eeb46766f8cf9e921ac293511804d39813f", size = 2111295, upload-time = "2026-01-21T18:42:52.366Z" }, + { url = "https://files.pythonhosted.org/packages/2d/54/f8d65bbde3d877617c4720f3c9f60e99bb7266df0d5d78b6e25e7c149f35/sqlalchemy-2.0.46-cp313-cp313-win_amd64.whl", hash = "sha256:77f8071d8fbcbb2dd11b7fd40dedd04e8ebe2eb80497916efedba844298065ef", size = 2137076, upload-time = "2026-01-21T18:42:53.924Z" }, + { url = "https://files.pythonhosted.org/packages/56/ba/9be4f97c7eb2b9d5544f2624adfc2853e796ed51d2bb8aec90bc94b7137e/sqlalchemy-2.0.46-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a1e8cc6cc01da346dc92d9509a63033b9b1bda4fed7a7a7807ed385c7dccdc10", size = 3556533, upload-time = "2026-01-21T18:33:06.636Z" }, + { url = "https://files.pythonhosted.org/packages/20/a6/b1fc6634564dbb4415b7ed6419cdfeaadefd2c39cdab1e3aa07a5f2474c2/sqlalchemy-2.0.46-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:96c7cca1a4babaaf3bfff3e4e606e38578856917e52f0384635a95b226c87764", size = 3523208, upload-time = "2026-01-21T18:45:08.436Z" }, + { url = "https://files.pythonhosted.org/packages/a1/d8/41e0bdfc0f930ff236f86fccd12962d8fa03713f17ed57332d38af6a3782/sqlalchemy-2.0.46-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:b2a9f9aee38039cf4755891a1e50e1effcc42ea6ba053743f452c372c3152b1b", size = 3464292, upload-time = "2026-01-21T18:33:08.208Z" }, + { url = "https://files.pythonhosted.org/packages/f0/8b/9dcbec62d95bea85f5ecad9b8d65b78cc30fb0ffceeb3597961f3712549b/sqlalchemy-2.0.46-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:db23b1bf8cfe1f7fda19018e7207b20cdb5168f83c437ff7e95d19e39289c447", size = 3473497, upload-time = "2026-01-21T18:45:10.552Z" }, + { url = "https://files.pythonhosted.org/packages/e9/f8/5ecdfc73383ec496de038ed1614de9e740a82db9ad67e6e4514ebc0708a3/sqlalchemy-2.0.46-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:56bdd261bfd0895452006d5316cbf35739c53b9bb71a170a331fa0ea560b2ada", size = 2152079, upload-time = "2026-01-21T19:05:58.477Z" }, + { url = "https://files.pythonhosted.org/packages/e5/bf/eba3036be7663ce4d9c050bc3d63794dc29fbe01691f2bf5ccb64e048d20/sqlalchemy-2.0.46-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:33e462154edb9493f6c3ad2125931e273bbd0be8ae53f3ecd1c161ea9a1dd366", size = 3272216, upload-time = "2026-01-21T18:46:52.634Z" }, + { url = "https://files.pythonhosted.org/packages/05/45/1256fb597bb83b58a01ddb600c59fe6fdf0e5afe333f0456ed75c0f8d7bd/sqlalchemy-2.0.46-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9bcdce05f056622a632f1d44bb47dbdb677f58cad393612280406ce37530eb6d", size = 3277208, upload-time = "2026-01-21T18:40:16.38Z" }, + { url = "https://files.pythonhosted.org/packages/d9/a0/2053b39e4e63b5d7ceb3372cface0859a067c1ddbd575ea7e9985716f771/sqlalchemy-2.0.46-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:8e84b09a9b0f19accedcbeff5c2caf36e0dd537341a33aad8d680336152dc34e", size = 3221994, upload-time = "2026-01-21T18:46:54.622Z" }, + { url = "https://files.pythonhosted.org/packages/1e/87/97713497d9502553c68f105a1cb62786ba1ee91dea3852ae4067ed956a50/sqlalchemy-2.0.46-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:4f52f7291a92381e9b4de9050b0a65ce5d6a763333406861e33906b8aa4906bf", size = 3243990, upload-time = "2026-01-21T18:40:18.253Z" }, + { url = "https://files.pythonhosted.org/packages/a8/87/5d1b23548f420ff823c236f8bea36b1a997250fd2f892e44a3838ca424f4/sqlalchemy-2.0.46-cp314-cp314-win32.whl", hash = "sha256:70ed2830b169a9960193f4d4322d22be5c0925357d82cbf485b3369893350908", size = 2114215, upload-time = "2026-01-21T18:42:55.232Z" }, + { url = "https://files.pythonhosted.org/packages/3a/20/555f39cbcf0c10cf452988b6a93c2a12495035f68b3dbd1a408531049d31/sqlalchemy-2.0.46-cp314-cp314-win_amd64.whl", hash = "sha256:3c32e993bc57be6d177f7d5d31edb93f30726d798ad86ff9066d75d9bf2e0b6b", size = 2139867, upload-time = "2026-01-21T18:42:56.474Z" }, + { url = "https://files.pythonhosted.org/packages/3e/f0/f96c8057c982d9d8a7a68f45d69c674bc6f78cad401099692fe16521640a/sqlalchemy-2.0.46-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4dafb537740eef640c4d6a7c254611dca2df87eaf6d14d6a5fca9d1f4c3fc0fa", size = 3561202, upload-time = "2026-01-21T18:33:10.337Z" }, + { url = "https://files.pythonhosted.org/packages/d7/53/3b37dda0a5b137f21ef608d8dfc77b08477bab0fe2ac9d3e0a66eaeab6fc/sqlalchemy-2.0.46-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:42a1643dc5427b69aca967dae540a90b0fbf57eaf248f13a90ea5930e0966863", size = 3526296, upload-time = "2026-01-21T18:45:12.657Z" }, + { url = "https://files.pythonhosted.org/packages/33/75/f28622ba6dde79cd545055ea7bd4062dc934e0621f7b3be2891f8563f8de/sqlalchemy-2.0.46-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:ff33c6e6ad006bbc0f34f5faf941cfc62c45841c64c0a058ac38c799f15b5ede", size = 3470008, upload-time = "2026-01-21T18:33:11.725Z" }, + { url = "https://files.pythonhosted.org/packages/a9/42/4afecbbc38d5e99b18acef446453c76eec6fbd03db0a457a12a056836e22/sqlalchemy-2.0.46-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:82ec52100ec1e6ec671563bbd02d7c7c8d0b9e71a0723c72f22ecf52d1755330", size = 3476137, upload-time = "2026-01-21T18:45:15.001Z" }, + { url = "https://files.pythonhosted.org/packages/fc/a1/9c4efa03300926601c19c18582531b45aededfb961ab3c3585f1e24f120b/sqlalchemy-2.0.46-py3-none-any.whl", hash = "sha256:f9c11766e7e7c0a2767dda5acb006a118640c9fc0a4104214b96269bfb78399e", size = 1937882, upload-time = "2026-01-21T18:22:10.456Z" }, ] [package.optional-dependencies]