From c17511d2e86e401ab1f292dcba7a228829f28b39 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BA=8E=E5=B0=8F=E4=B8=98?= Date: Fri, 26 Dec 2025 19:29:29 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=A8=A1=E5=9E=8B=E5=AE=9A?= =?UTF-8?q?=E4=B9=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- models/database.py | 2 +- models/download.py | 12 +++++++----- models/node.py | 6 +++--- models/order.py | 2 +- models/tag.py | 2 +- models/task.py | 6 +++--- models/user.py | 8 ++++---- pyproject.toml | 1 + uv.lock | 34 ++++++++++++++++++++++++++++++++++ 9 files changed, 55 insertions(+), 18 deletions(-) diff --git a/models/database.py b/models/database.py index 1600837..cef7602 100644 --- a/models/database.py +++ b/models/database.py @@ -12,7 +12,7 @@ engine: AsyncEngine = create_async_engine( echo=appmeta.debug, connect_args={ "check_same_thread": False - } if ASYNC_DATABASE_URL.startswith("sqlite") else None, + } if ASYNC_DATABASE_URL.startswith("sqlite") else {}, future=True, # pool_size=POOL_SIZE, # max_overflow=64, diff --git a/models/download.py b/models/download.py index 388d60d..1440ad4 100644 --- a/models/download.py +++ b/models/download.py @@ -14,6 +14,8 @@ if TYPE_CHECKING: class DownloadStatus(StrEnum): """下载状态枚举""" + PREPARING = "preparing" + """准备中""" RUNNING = "running" """进行中""" COMPLETED = "completed" @@ -119,25 +121,25 @@ class Download(DownloadBase, UUIDTableBaseMixin): Index("ix_download_user_status", "user_id", "status"), ) - status: DownloadStatus = Field(default=DownloadStatus.RUNNING, sa_column_kwargs={"server_default": "'running'"}, index=True) + status: DownloadStatus = Field(default=DownloadStatus.PREPARING, index=True) """下载状态""" - type: int = Field(default=0, sa_column_kwargs={"server_default": "0"}) + type: int = Field(default=0) """任务类型 [TODO] 待定义枚举""" source: str """来源URL或标识""" - total_size: int = Field(default=0, sa_column_kwargs={"server_default": "0"}) + total_size: int = Field(default=0) """总大小(字节)""" - downloaded_size: int = Field(default=0, sa_column_kwargs={"server_default": "0"}) + downloaded_size: int = Field(default=0) """已下载大小(字节)""" g_id: str | None = Field(default=None, index=True) """Aria2 GID""" - speed: int = Field(default=0, sa_column_kwargs={"server_default": "0"}) + speed: int = Field(default=0) """下载速度(bytes/s)""" parent: str | None = Field(default=None, max_length=255) diff --git a/models/node.py b/models/node.py index 4c34d65..26679f5 100644 --- a/models/node.py +++ b/models/node.py @@ -68,7 +68,7 @@ class Node(SQLModelBase, TableBaseMixin): Index("ix_node_status", "status"), ) - status: NodeStatus = Field(default=NodeStatus.ONLINE, sa_column_kwargs={"server_default": "'online'"}) + status: NodeStatus = Field(default=NodeStatus.ONLINE) """节点状态""" name: str = Field(max_length=255, unique=True) @@ -86,10 +86,10 @@ class Node(SQLModelBase, TableBaseMixin): master_key: str | None = Field(default=None, max_length=255) """主机通讯密钥""" - aria2_enabled: bool = Field(default=False, sa_column_kwargs={"server_default": text("false")}) + aria2_enabled: bool = False """是否启用Aria2""" - rank: int = Field(default=0, sa_column_kwargs={"server_default": "0"}) + rank: int = 0 """节点排序权重""" # 关系 diff --git a/models/order.py b/models/order.py index 9ec6efc..4af80e5 100644 --- a/models/order.py +++ b/models/order.py @@ -51,7 +51,7 @@ class Order(SQLModelBase, TableBaseMixin): price: int = Field(default=0, sa_column_kwargs={"server_default": "0"}) """订单价格(分)""" - status: OrderStatus = Field(default=OrderStatus.PENDING, sa_column_kwargs={"server_default": "'pending'"}) + status: OrderStatus = Field(default=OrderStatus.PENDING) """订单状态""" # 外键 diff --git a/models/tag.py b/models/tag.py index b1fd909..2b1b792 100644 --- a/models/tag.py +++ b/models/tag.py @@ -34,7 +34,7 @@ class Tag(SQLModelBase, TableBaseMixin): color: str | None = Field(default=None, max_length=255) """标签颜色""" - type: TagType = Field(default=TagType.MANUAL, sa_column_kwargs={"server_default": "'manual'"}) + type: TagType = Field(default=TagType.MANUAL) """标签类型""" expression: str | None = Field(default=None, description="自动标签的匹配表达式") diff --git a/models/task.py b/models/task.py index c46657f..39327b1 100644 --- a/models/task.py +++ b/models/task.py @@ -70,13 +70,13 @@ class Task(SQLModelBase, TableBaseMixin): Index("ix_task_user_status", "user_id", "status"), ) - status: TaskStatus = Field(default=TaskStatus.QUEUED, sa_column_kwargs={"server_default": "'queued'"}) + status: TaskStatus = Field(default=TaskStatus.QUEUED) """任务状态""" - type: int = Field(default=0, sa_column_kwargs={"server_default": "0"}) + type: int = Field(default=0) """任务类型 [TODO] 待定义枚举""" - progress: int = Field(default=0, sa_column_kwargs={"server_default": "0"}, ge=0, le=100) + progress: int = Field(default=0, ge=0, le=100) """任务进度(0-100)""" error: str | None = Field(default=None) diff --git a/models/user.py b/models/user.py index 4146717..e9c13d8 100644 --- a/models/user.py +++ b/models/user.py @@ -313,13 +313,13 @@ class User(UserBase, UUIDTableBaseMixin): """当前用户组过期时间""" # Option 相关字段 - theme: ThemeType = Field(default=ThemeType.SYSTEM, sa_column_kwargs={"server_default": "system"}) - """主题类型: light/dark/system""" + # theme: ThemeType = Field(default=ThemeType.SYSTEM) + # """主题类型: light/dark/system""" - language: str = Field(default="zh-CN", max_length=5, sa_column_kwargs={"server_default": "zh-CN"}) + language: str = Field(default="zh-CN", max_length=5) """语言偏好""" - timezone: int = Field(default=8, ge=-12, le=12, sa_column_kwargs={"server_default": "8"}) + timezone: int = Field(default=8, ge=-12, le=12) """时区,UTC 偏移小时数""" # 外键 diff --git a/pyproject.toml b/pyproject.toml index 3bdb291..fd9ef4f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -9,6 +9,7 @@ dependencies = [ "aiohttp>=3.13.2", "aiosqlite==0.22.1", "argon2-cffi>=25.1.0", + "asyncpg>=0.31.0", "cachetools>=6.2.4", "fastapi[standard]>=0.122.0", "httpx>=0.27.0", diff --git a/uv.lock b/uv.lock index 7b075bc..ca54b67 100644 --- a/uv.lock +++ b/uv.lock @@ -195,6 +195,38 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c9/7f/09065fd9e27da0eda08b4d6897f1c13535066174cc023af248fc2a8d5e5a/asn1crypto-1.5.1-py2.py3-none-any.whl", hash = "sha256:db4e40728b728508912cbb3d44f19ce188f218e9eba635821bb4b68564f8fd67", size = 105045, upload-time = "2022-03-15T14:46:51.055Z" }, ] +[[package]] +name = "asyncpg" +version = "0.31.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/fe/cc/d18065ce2380d80b1bcce927c24a2642efd38918e33fd724bc4bca904877/asyncpg-0.31.0.tar.gz", hash = "sha256:c989386c83940bfbd787180f2b1519415e2d3d6277a70d9d0f0145ac73500735", size = 993667, upload-time = "2025-11-24T23:27:00.812Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/95/11/97b5c2af72a5d0b9bc3fa30cd4b9ce22284a9a943a150fdc768763caf035/asyncpg-0.31.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c204fab1b91e08b0f47e90a75d1b3c62174dab21f670ad6c5d0f243a228f015b", size = 661111, upload-time = "2025-11-24T23:26:04.467Z" }, + { url = "https://files.pythonhosted.org/packages/1b/71/157d611c791a5e2d0423f09f027bd499935f0906e0c2a416ce712ba51ef3/asyncpg-0.31.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:54a64f91839ba59008eccf7aad2e93d6e3de688d796f35803235ea1c4898ae1e", size = 636928, upload-time = "2025-11-24T23:26:05.944Z" }, + { url = "https://files.pythonhosted.org/packages/2e/fc/9e3486fb2bbe69d4a867c0b76d68542650a7ff1574ca40e84c3111bb0c6e/asyncpg-0.31.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c0e0822b1038dc7253b337b0f3f676cadc4ac31b126c5d42691c39691962e403", size = 3424067, upload-time = "2025-11-24T23:26:07.957Z" }, + { url = "https://files.pythonhosted.org/packages/12/c6/8c9d076f73f07f995013c791e018a1cd5f31823c2a3187fc8581706aa00f/asyncpg-0.31.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bef056aa502ee34204c161c72ca1f3c274917596877f825968368b2c33f585f4", size = 3518156, upload-time = "2025-11-24T23:26:09.591Z" }, + { url = "https://files.pythonhosted.org/packages/ae/3b/60683a0baf50fbc546499cfb53132cb6835b92b529a05f6a81471ab60d0c/asyncpg-0.31.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0bfbcc5b7ffcd9b75ab1558f00db2ae07db9c80637ad1b2469c43df79d7a5ae2", size = 3319636, upload-time = "2025-11-24T23:26:11.168Z" }, + { url = "https://files.pythonhosted.org/packages/50/dc/8487df0f69bd398a61e1792b3cba0e47477f214eff085ba0efa7eac9ce87/asyncpg-0.31.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:22bc525ebbdc24d1261ecbf6f504998244d4e3be1721784b5f64664d61fbe602", size = 3472079, upload-time = "2025-11-24T23:26:13.164Z" }, + { url = "https://files.pythonhosted.org/packages/13/a1/c5bbeeb8531c05c89135cb8b28575ac2fac618bcb60119ee9696c3faf71c/asyncpg-0.31.0-cp313-cp313-win32.whl", hash = "sha256:f890de5e1e4f7e14023619399a471ce4b71f5418cd67a51853b9910fdfa73696", size = 527606, upload-time = "2025-11-24T23:26:14.78Z" }, + { url = "https://files.pythonhosted.org/packages/91/66/b25ccb84a246b470eb943b0107c07edcae51804912b824054b3413995a10/asyncpg-0.31.0-cp313-cp313-win_amd64.whl", hash = "sha256:dc5f2fa9916f292e5c5c8b2ac2813763bcd7f58e130055b4ad8a0531314201ab", size = 596569, upload-time = "2025-11-24T23:26:16.189Z" }, + { url = "https://files.pythonhosted.org/packages/3c/36/e9450d62e84a13aea6580c83a47a437f26c7ca6fa0f0fd40b6670793ea30/asyncpg-0.31.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:f6b56b91bb0ffc328c4e3ed113136cddd9deefdf5f79ab448598b9772831df44", size = 660867, upload-time = "2025-11-24T23:26:17.631Z" }, + { url = "https://files.pythonhosted.org/packages/82/4b/1d0a2b33b3102d210439338e1beea616a6122267c0df459ff0265cd5807a/asyncpg-0.31.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:334dec28cf20d7f5bb9e45b39546ddf247f8042a690bff9b9573d00086e69cb5", size = 638349, upload-time = "2025-11-24T23:26:19.689Z" }, + { url = "https://files.pythonhosted.org/packages/41/aa/e7f7ac9a7974f08eff9183e392b2d62516f90412686532d27e196c0f0eeb/asyncpg-0.31.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:98cc158c53f46de7bb677fd20c417e264fc02b36d901cc2a43bd6cb0dc6dbfd2", size = 3410428, upload-time = "2025-11-24T23:26:21.275Z" }, + { url = "https://files.pythonhosted.org/packages/6f/de/bf1b60de3dede5c2731e6788617a512bc0ebd9693eac297ee74086f101d7/asyncpg-0.31.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9322b563e2661a52e3cdbc93eed3be7748b289f792e0011cb2720d278b366ce2", size = 3471678, upload-time = "2025-11-24T23:26:23.627Z" }, + { url = "https://files.pythonhosted.org/packages/46/78/fc3ade003e22d8bd53aaf8f75f4be48f0b460fa73738f0391b9c856a9147/asyncpg-0.31.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:19857a358fc811d82227449b7ca40afb46e75b33eb8897240c3839dd8b744218", size = 3313505, upload-time = "2025-11-24T23:26:25.235Z" }, + { url = "https://files.pythonhosted.org/packages/bf/e9/73eb8a6789e927816f4705291be21f2225687bfa97321e40cd23055e903a/asyncpg-0.31.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:ba5f8886e850882ff2c2ace5732300e99193823e8107e2c53ef01c1ebfa1e85d", size = 3434744, upload-time = "2025-11-24T23:26:26.944Z" }, + { url = "https://files.pythonhosted.org/packages/08/4b/f10b880534413c65c5b5862f79b8e81553a8f364e5238832ad4c0af71b7f/asyncpg-0.31.0-cp314-cp314-win32.whl", hash = "sha256:cea3a0b2a14f95834cee29432e4ddc399b95700eb1d51bbc5bfee8f31fa07b2b", size = 532251, upload-time = "2025-11-24T23:26:28.404Z" }, + { url = "https://files.pythonhosted.org/packages/d3/2d/7aa40750b7a19efa5d66e67fc06008ca0f27ba1bd082e457ad82f59aba49/asyncpg-0.31.0-cp314-cp314-win_amd64.whl", hash = "sha256:04d19392716af6b029411a0264d92093b6e5e8285ae97a39957b9a9c14ea72be", size = 604901, upload-time = "2025-11-24T23:26:30.34Z" }, + { url = "https://files.pythonhosted.org/packages/ce/fe/b9dfe349b83b9dee28cc42360d2c86b2cdce4cb551a2c2d27e156bcac84d/asyncpg-0.31.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:bdb957706da132e982cc6856bb2f7b740603472b54c3ebc77fe60ea3e57e1bd2", size = 702280, upload-time = "2025-11-24T23:26:32Z" }, + { url = "https://files.pythonhosted.org/packages/6a/81/e6be6e37e560bd91e6c23ea8a6138a04fd057b08cf63d3c5055c98e81c1d/asyncpg-0.31.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:6d11b198111a72f47154fa03b85799f9be63701e068b43f84ac25da0bda9cb31", size = 682931, upload-time = "2025-11-24T23:26:33.572Z" }, + { url = "https://files.pythonhosted.org/packages/a6/45/6009040da85a1648dd5bc75b3b0a062081c483e75a1a29041ae63a0bf0dc/asyncpg-0.31.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:18c83b03bc0d1b23e6230f5bf8d4f217dc9bc08644ce0502a9d91dc9e634a9c7", size = 3581608, upload-time = "2025-11-24T23:26:35.638Z" }, + { url = "https://files.pythonhosted.org/packages/7e/06/2e3d4d7608b0b2b3adbee0d0bd6a2d29ca0fc4d8a78f8277df04e2d1fd7b/asyncpg-0.31.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e009abc333464ff18b8f6fd146addffd9aaf63e79aa3bb40ab7a4c332d0c5e9e", size = 3498738, upload-time = "2025-11-24T23:26:37.275Z" }, + { url = "https://files.pythonhosted.org/packages/7d/aa/7d75ede780033141c51d83577ea23236ba7d3a23593929b32b49db8ed36e/asyncpg-0.31.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:3b1fbcb0e396a5ca435a8826a87e5c2c2cc0c8c68eb6fadf82168056b0e53a8c", size = 3401026, upload-time = "2025-11-24T23:26:39.423Z" }, + { url = "https://files.pythonhosted.org/packages/ba/7a/15e37d45e7f7c94facc1e9148c0e455e8f33c08f0b8a0b1deb2c5171771b/asyncpg-0.31.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:8df714dba348efcc162d2adf02d213e5fab1bd9f557e1305633e851a61814a7a", size = 3429426, upload-time = "2025-11-24T23:26:41.032Z" }, + { url = "https://files.pythonhosted.org/packages/13/d5/71437c5f6ae5f307828710efbe62163974e71237d5d46ebd2869ea052d10/asyncpg-0.31.0-cp314-cp314t-win32.whl", hash = "sha256:1b41f1afb1033f2b44f3234993b15096ddc9cd71b21a42dbd87fc6a57b43d65d", size = 614495, upload-time = "2025-11-24T23:26:42.659Z" }, + { url = "https://files.pythonhosted.org/packages/3c/d7/8fb3044eaef08a310acfe23dae9a8e2e07d305edc29a53497e52bc76eca7/asyncpg-0.31.0-cp314-cp314t-win_amd64.whl", hash = "sha256:bd4107bb7cdd0e9e65fae66a62afd3a249663b844fa34d479f6d5b3bef9c04c3", size = 706062, upload-time = "2025-11-24T23:26:44.086Z" }, +] + [[package]] name = "attrs" version = "25.4.0" @@ -439,6 +471,7 @@ dependencies = [ { name = "aiohttp" }, { name = "aiosqlite" }, { name = "argon2-cffi" }, + { name = "asyncpg" }, { name = "cachetools" }, { name = "fastapi", extra = ["standard"] }, { name = "httpx" }, @@ -465,6 +498,7 @@ requires-dist = [ { name = "aiohttp", specifier = ">=3.13.2" }, { name = "aiosqlite", specifier = "==0.22.1" }, { name = "argon2-cffi", specifier = ">=25.1.0" }, + { name = "asyncpg", specifier = ">=0.31.0" }, { name = "cachetools", specifier = ">=6.2.4" }, { name = "fastapi", extras = ["standard"], specifier = ">=0.122.0" }, { name = "httpx", specifier = ">=0.27.0" },