From 43edb12d6a190697ce6f505c731e8aacaec3993d Mon Sep 17 00:00:00 2001 From: worldmozara Date: Tue, 14 Jul 2026 17:19:31 +0800 Subject: [PATCH] core/memory: add SQLAlchemy schema for user, session, message --- src/plyngent/memory/__init__.py | 0 src/plyngent/memory/database/__init__.py | 0 src/plyngent/memory/database/schema.py | 52 ++++++++++++++++++++++++ 3 files changed, 52 insertions(+) create mode 100644 src/plyngent/memory/__init__.py create mode 100644 src/plyngent/memory/database/__init__.py create mode 100644 src/plyngent/memory/database/schema.py diff --git a/src/plyngent/memory/__init__.py b/src/plyngent/memory/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/plyngent/memory/database/__init__.py b/src/plyngent/memory/database/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/plyngent/memory/database/schema.py b/src/plyngent/memory/database/schema.py new file mode 100644 index 0000000..7c2b42c --- /dev/null +++ b/src/plyngent/memory/database/schema.py @@ -0,0 +1,52 @@ +from datetime import datetime # noqa: TC003 + +from sqlalchemy import JSON, DateTime, ForeignKey, String, UniqueConstraint, func +from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, relationship + + +class PlyngentBase(DeclarativeBase): + pass + + +class User(PlyngentBase): + __tablename__: str = "user" + + uid: Mapped[int] = mapped_column(primary_key=True) + name: Mapped[str] = mapped_column(String(48), unique=True) + email: Mapped[str] = mapped_column(String(255), unique=True) + password_hash: Mapped[str] = mapped_column(String(256)) + created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now()) + # deleted_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True) + + sessions: Mapped[list["Session"]] = relationship(back_populates="user", cascade="all, delete-orphan") + + +class Session(PlyngentBase): + __tablename__: str = "session" + + sid: Mapped[int] = mapped_column(primary_key=True) + uid: Mapped[int] = mapped_column(ForeignKey(User.uid, ondelete="CASCADE"), index=True) + name: Mapped[str] = mapped_column(String(64)) + created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now()) + updated_at: Mapped[datetime] = mapped_column( + DateTime(timezone=True), server_default=func.now(), onupdate=func.now() + ) + + user: Mapped[User] = relationship(back_populates="sessions") + messages: Mapped[list["Message"]] = relationship(back_populates="session", cascade="all, delete-orphan") + + +class Message(PlyngentBase): + __tablename__: str = "message" + __table_args__: tuple[object, ...] = (UniqueConstraint("sid", "seq", name="uq_session_seq"),) + + mid: Mapped[int] = mapped_column(primary_key=True) + sid: Mapped[int] = mapped_column(ForeignKey(Session.sid, ondelete="CASCADE"), index=True) + seq: Mapped[int] = mapped_column(index=True) + data: Mapped[dict[str, object]] = mapped_column(JSON()) + created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now()) + updated_at: Mapped[datetime] = mapped_column( + DateTime(timezone=True), server_default=func.now(), onupdate=func.now() + ) + + session: Mapped[Session] = relationship(back_populates="messages")