首页
/ Websauna项目教程:创建你的第一个数据模型

Websauna项目教程:创建你的第一个数据模型

2025-06-07 03:54:15作者:冯爽妲Honey

前言

在Websauna框架中,数据模型是构建Web应用的核心部分。本教程将指导你如何在Websauna项目中创建第一个数据模型,特别是一个投票系统的数据模型。通过这个实例,你将学习到Websauna中模型定义、数据库迁移等关键概念。

模型基础

在Websauna中,模型使用SQLAlchemy进行定义。SQLAlchemy是一个强大的Python ORM(对象关系映射)工具,它允许你使用Python类来表示数据库表。

创建投票模型

我们将创建一个简单的投票系统,包含两个主要模型:

  1. Question(问题):表示投票的问题
  2. Choice(选项):表示每个问题的可选答案

在你的models.py文件中添加以下代码:

from uuid import uuid4
from sqlalchemy import Column, String, Integer, ForeignKey
from websauna.system.model.columns import UUID
from sqlalchemy.orm import relationship
from websauna.system.model.meta import Base
from websauna.system.model.columns import UTCDateTime

class Question(Base):
    """表示投票问题的模型"""
    
    __tablename__ = "question"  # 数据库表名
    
    # 主键字段
    id = Column(Integer, autoincrement=True, primary_key=True)
    
    # 公开使用的UUID,比自增ID更安全
    uuid = Column(UUID(as_uuid=True), default=uuid4)
    
    # 问题文本
    question_text = Column(String(256), default=None)
    
    # 发布时间(UTC时间)
    published_at = Column(UTCDateTime, default=None)
    
    # 与Choice模型的一对多关系
    choices = relationship("Choice",
                          back_populates="question",
                          lazy="dynamic",
                          cascade="all, delete-orphan",
                          single_parent=True)

class Choice(Base):
    """表示投票选项的模型"""
    
    __tablename__ = "choice"  # 数据库表名
    
    # 主键字段
    id = Column(Integer, autoincrement=True, primary_key=True)
    
    # 公开使用的UUID
    uuid = Column(UUID(as_uuid=True), default=uuid4)
    
    # 选项文本
    choice_text = Column(String(256), default=None)
    
    # 投票计数
    votes = Column(Integer, default=0)
    
    # 外键关联到Question
    question_id = Column(Integer, ForeignKey('question.id'))
    question = relationship("Question", back_populates="choices")

关键点解析

  1. Base类:所有模型都继承自websauna.system.model.meta.Base,这是Websauna提供的默认模型基类。

  2. UUID字段:我们使用UUID而不是自增ID作为公开标识符,这提高了安全性,防止恶意用户猜测ID。

  3. 时间处理UTCDateTime确保所有时间都以UTC格式存储,避免了时区相关的问题。

  4. 关系定义:我们定义了Question和Choice之间的一对多关系,并配置了级联删除等行为。

数据库迁移

仅仅定义Python模型是不够的,我们还需要将这些变更应用到数据库中。这个过程称为数据库迁移。

为什么需要迁移

当你尝试启动开发服务器时,Websauna的完整性检查会发现数据库结构与模型定义不匹配,导致启动失败。这是Websauna的安全机制,防止你使用不一致的数据库结构。

创建迁移脚本

执行以下命令创建迁移脚本:

ws-alembic -c company/application/conf/development.ini revision --auto -m "Added choices and questions"

这个命令会分析模型与数据库的差异,并生成一个迁移脚本。Websauna使用Alembic来管理数据库迁移。

应用迁移

创建迁移脚本后,执行以下命令将变更应用到数据库:

ws-alembic -c company/application/conf/development.ini upgrade head

注意:PostgreSQL的迁移是事务性的,这意味着整个迁移要么完全成功,要么完全失败。这为迁移过程提供了额外的安全保障。

验证结果

迁移完成后,你可以使用数据库命令行工具检查新创建的表:

ws-db-shell

在数据库shell中,你可以看到新创建的questionchoice表。

最佳实践

  1. 小步迁移:每次只做少量模型变更,然后生成并测试迁移脚本。

  2. 描述性消息:为每个迁移提供清晰的描述信息,方便日后维护。

  3. 测试环境验证:在应用到生产环境前,先在测试环境中验证迁移。

  4. 备份:执行重要迁移前,确保有数据库备份。

总结

通过本教程,你学会了:

  1. 如何在Websauna中定义数据模型
  2. 模型间关系的配置方法
  3. 数据库迁移的基本流程
  4. 模型设计中的安全考虑(如使用UUID)

这些知识为你构建更复杂的Websauna应用打下了坚实基础。在后续教程中,我们将学习如何为这些模型创建视图和表单,实现完整的投票功能。

登录后查看全文
热门项目推荐

项目优选

收起