fix(account): 支持跨平台同名账号——(platform,name)联合唯一+Asset.account_id外键重构
This commit is contained in:
+11
-5
@@ -5,14 +5,14 @@
|
||||
- VPSDetail: VPS 资产详情(与 Asset 一对一关联)
|
||||
- DomainDetail: 域名资产详情(与 Asset 一对一关联)
|
||||
- AIAccount: AI Agent 账号详情(与 Asset 一对一关联)
|
||||
- Account: 平台账号字典(Asset.account 按名称引用)
|
||||
- Account: 平台账号字典(Asset.account_id 外键引用)
|
||||
"""
|
||||
|
||||
from datetime import date, datetime
|
||||
from enum import Enum
|
||||
from typing import Optional
|
||||
|
||||
from sqlalchemy import Index
|
||||
from sqlalchemy import Index, UniqueConstraint
|
||||
from sqlmodel import Field, SQLModel
|
||||
|
||||
from app.core.timeutils import utcnow
|
||||
@@ -65,7 +65,10 @@ class Asset(SQLModel, table=True):
|
||||
default=None, description="取消订阅网址(去哪取消)"
|
||||
)
|
||||
account: Optional[str] = Field(
|
||||
default=None, description="所属账号标识(如 Cloudflare 账号邮箱)"
|
||||
default=None, description="所属账号标识(历史字段,迁移后由 account_id 取代,仅作迁移数据源)"
|
||||
)
|
||||
account_id: Optional[int] = Field(
|
||||
default=None, foreign_key="accounts.id", index=True, description="所属账号 ID(外键关联 accounts)"
|
||||
)
|
||||
expiry_date: Optional[date] = Field(
|
||||
default=None, index=True, description="到期/续费日期,用于续费提醒"
|
||||
@@ -201,15 +204,18 @@ class CloudflareDetail(SQLModel, table=True):
|
||||
class Account(SQLModel, table=True):
|
||||
"""平台账号字典:统一管理各平台下的账号(多账号场景区分归属)
|
||||
|
||||
资产的 Asset.account 字段按名称引用本表,重命名时由服务层同步更新引用。
|
||||
资产的 Asset.account_id 字段外键引用本表,重命名账号不影响资产归属。
|
||||
唯一性:(platform, name) 联合唯一——同一邮箱/用户名可跨平台复用。
|
||||
凭证层:登录用户名/密码(网站登录)+ API 配置 JSON(SDK 同步用),
|
||||
平台本身不再持有凭证(Provider.api_config_encrypted 已弃用,仅留历史值)。
|
||||
"""
|
||||
|
||||
__tablename__ = "accounts"
|
||||
# (platform, name) 联合唯一:同一邮箱/用户名可跨平台复用,同平台内不允许重名
|
||||
__table_args__ = (UniqueConstraint("platform", "name", name="uq_accounts_platform_name"),)
|
||||
|
||||
id: Optional[int] = Field(default=None, primary_key=True)
|
||||
name: str = Field(unique=True, index=True, description="账号标识(如邮箱/用户名)")
|
||||
name: str = Field(index=True, description="账号标识(如邮箱/用户名)")
|
||||
platform: Optional[str] = Field(
|
||||
default=None, index=True, description="所属平台(slug 或名称)"
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user