discard adjustable models' id prefix & payload length
This commit is contained in:
+8
-6
@@ -56,22 +56,24 @@ class AutoID:
|
||||
不再需要手动定义任何 prefix,全自动根据 __tablename__ 编码生成
|
||||
支持子类自定义长度
|
||||
"""
|
||||
# 默认配置
|
||||
_id_prefix_len = 3 # 前缀长度
|
||||
_id_payload_len = 22 # 主体长度
|
||||
# 全局固定配置
|
||||
ID_PREFIX_LEN = 3
|
||||
ID_PAYLOAD_LEN = 22
|
||||
|
||||
@classmethod
|
||||
def id_length(cls) -> int:
|
||||
"""返回当前类 ID 的总长度"""
|
||||
return cls._id_prefix_len + cls._id_payload_len
|
||||
return cls.ID_PREFIX_LEN + cls.ID_PAYLOAD_LEN
|
||||
|
||||
@declared_attr
|
||||
def id(cls):
|
||||
# 运行时动态获取子类的 __tablename__
|
||||
tablename = cls.__tablename__
|
||||
|
||||
# 获取子类配置的长度
|
||||
p_len = cls._id_prefix_len
|
||||
s_len = cls._id_payload_len
|
||||
p_len = AutoID.ID_PREFIX_LEN
|
||||
s_len = AutoID.ID_PAYLOAD_LEN
|
||||
|
||||
prefix = encode_tablename_to_prefix(tablename, length=p_len)
|
||||
|
||||
# 核心工厂函数:拼接【编码后的表前缀】和【递增Payload】
|
||||
|
||||
@@ -1,25 +1,18 @@
|
||||
from typing import TYPE_CHECKING
|
||||
from sqlalchemy import Column, DateTime, String, ForeignKey, UniqueConstraint
|
||||
from sqlalchemy.sql import func
|
||||
from .base import AutoID, Base
|
||||
|
||||
# 只有在静态检查时才导入
|
||||
# 运行阶段这段代码会被跳过,彻底避免循环导入
|
||||
# 不确定是否用得上,但感觉这是个好习惯,尤其在模型之间有外键关系时
|
||||
if TYPE_CHECKING:
|
||||
from .user import User
|
||||
|
||||
class Follow(Base, AutoID):
|
||||
"""用户关注关系表"""
|
||||
__tablename__ = "follows"
|
||||
|
||||
follower_id = Column(
|
||||
String(User.id_length()),
|
||||
String(AutoID.id_length()),
|
||||
ForeignKey("users.id", ondelete="CASCADE"),
|
||||
index=True
|
||||
)
|
||||
followee_id = Column(
|
||||
String(User.id_length()),
|
||||
String(AutoID.id_length()),
|
||||
ForeignKey("users.id", ondelete="CASCADE"),
|
||||
index=True
|
||||
)
|
||||
|
||||
@@ -1,24 +1,18 @@
|
||||
from typing import TYPE_CHECKING
|
||||
from sqlalchemy import Column, DateTime, String, ForeignKey, UniqueConstraint
|
||||
from sqlalchemy.sql import func
|
||||
from .base import AutoID, Base
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from .user import User
|
||||
from .project import ProjectItem
|
||||
from .workspace import Workspace
|
||||
|
||||
class ProjectLike(Base, AutoID):
|
||||
"""项目点赞表"""
|
||||
__tablename__ = "project_likes"
|
||||
|
||||
user_id = Column(
|
||||
String(User.id_length()),
|
||||
String(AutoID.id_length()),
|
||||
ForeignKey("users.id", ondelete="CASCADE"),
|
||||
index=True
|
||||
)
|
||||
project_item_id = Column(
|
||||
String(ProjectItem.id_length()),
|
||||
String(AutoID.id_length()),
|
||||
ForeignKey("project_items.id", ondelete="CASCADE"),
|
||||
index=True
|
||||
)
|
||||
@@ -34,12 +28,12 @@ class ProjectFavorite(Base, AutoID):
|
||||
__tablename__ = "project_favorites"
|
||||
|
||||
user_id = Column(
|
||||
String(User.id_length()),
|
||||
String(AutoID.id_length()),
|
||||
ForeignKey("users.id", ondelete="CASCADE"),
|
||||
index=True
|
||||
)
|
||||
project_item_id = Column(
|
||||
String(ProjectItem.id_length()),
|
||||
String(AutoID.id_length()),
|
||||
ForeignKey("project_items.id", ondelete="CASCADE"),
|
||||
index=True
|
||||
)
|
||||
@@ -55,12 +49,12 @@ class ProjectShare(Base, AutoID):
|
||||
__tablename__ = "project_shares"
|
||||
|
||||
user_id = Column(
|
||||
String(User.id_length()),
|
||||
String(AutoID.id_length()),
|
||||
ForeignKey("users.id", ondelete="CASCADE"),
|
||||
index=True
|
||||
)
|
||||
project_item_id = Column(
|
||||
String(ProjectItem.id_length()),
|
||||
String(AutoID.id_length()),
|
||||
ForeignKey("project_items.id", ondelete="CASCADE"),
|
||||
index=True
|
||||
)
|
||||
|
||||
@@ -1,18 +1,13 @@
|
||||
from typing import TYPE_CHECKING
|
||||
from sqlalchemy import Column, DateTime, String, ForeignKey, BigInteger
|
||||
from sqlalchemy.sql import func
|
||||
from .base import AutoID, Base
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from .user import User
|
||||
from .workspace import Workspace
|
||||
|
||||
class LibraryItem(Base, AutoID):
|
||||
"""工作区共享媒体/文件资源库"""
|
||||
__tablename__ = "library_items"
|
||||
|
||||
workspace_id = Column(
|
||||
String(Workspace.id_length()),
|
||||
String(AutoID.id_length()),
|
||||
ForeignKey("workspaces.id", ondelete="CASCADE"),
|
||||
index=True,
|
||||
)
|
||||
@@ -34,7 +29,7 @@ class LibraryItem(Base, AutoID):
|
||||
mime_type = Column(String, nullable=True) # 媒体类型,例如 'image/jpeg', 'video/mp4', 'application/pdf'
|
||||
|
||||
uploaded_by = Column(
|
||||
String(User.id_length()),
|
||||
String(AutoID.id_length()),
|
||||
ForeignKey("users.id", ondelete="SET NULL"),
|
||||
nullable=True,
|
||||
)
|
||||
|
||||
@@ -1,17 +1,13 @@
|
||||
from typing import TYPE_CHECKING
|
||||
from sqlalchemy import Column, DateTime, String, ForeignKey, Integer
|
||||
from sqlalchemy.sql import func
|
||||
from .base import AutoID, Base
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from .workspace import Workspace
|
||||
|
||||
class ProjectItem(Base, AutoID):
|
||||
"""项目与文件夹的树状虚拟文件系统"""
|
||||
__tablename__ = "project_items"
|
||||
|
||||
workspace_id = Column(
|
||||
String(Workspace.id_length()),
|
||||
String(AutoID.id_length()),
|
||||
ForeignKey("workspaces.id", ondelete="CASCADE"),
|
||||
index=True,
|
||||
)
|
||||
|
||||
@@ -1,11 +1,7 @@
|
||||
from typing import TYPE_CHECKING
|
||||
from sqlalchemy import Column, DateTime, String, ForeignKey, BigInteger, UniqueConstraint, Integer
|
||||
from sqlalchemy.sql import func
|
||||
from .base import AutoID, Base
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from .user import User
|
||||
|
||||
class Workspace(Base, AutoID):
|
||||
"""工作区表"""
|
||||
__tablename__ = "workspaces"
|
||||
@@ -34,13 +30,13 @@ class WorkspaceMember(Base, AutoID):
|
||||
__tablename__ = "workspace_members"
|
||||
|
||||
workspace_id = Column(
|
||||
String(Workspace.id_length()),
|
||||
String(AutoID.id_length()),
|
||||
ForeignKey("workspaces.id", ondelete="CASCADE"),
|
||||
index=True,
|
||||
)
|
||||
# 允许 user_id 为空,因为被邀请的人可能还没注册系统,我们先记录他的邮箱
|
||||
user_id = Column(
|
||||
String(User.id_length()),
|
||||
String(AutoID.id_length()),
|
||||
ForeignKey("users.id", ondelete="CASCADE"),
|
||||
nullable=True,
|
||||
index=True,
|
||||
|
||||
Reference in New Issue
Block a user