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

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

2025-06-07 11:18:56作者:冯爽妲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应用打下了坚实基础。在后续教程中,我们将学习如何为这些模型创建视图和表单,实现完整的投票功能。

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

热门内容推荐

最新内容推荐

项目优选

收起
openHiTLS-examplesopenHiTLS-examples
本仓将为广大高校开发者提供开源实践和创新开发平台,收集和展示openHiTLS示例代码及创新应用,欢迎大家投稿,让全世界看到您的精巧密码实现设计,也让更多人通过您的优秀成果,理解、喜爱上密码技术。
C
52
461
kernelkernel
deepin linux kernel
C
22
5
openHiTLSopenHiTLS
旨在打造算法先进、性能卓越、高效敏捷、安全可靠的密码套件,通过轻量级、可剪裁的软件技术架构满足各行业不同场景的多样化要求,让密码技术应用更简单,同时探索后量子等先进算法创新实践,构建密码前沿技术底座!
C
349
381
nop-entropynop-entropy
Nop Platform 2.0是基于可逆计算理论实现的采用面向语言编程范式的新一代低代码开发平台,包含基于全新原理从零开始研发的GraphQL引擎、ORM引擎、工作流引擎、报表引擎、规则引擎、批处理引引擎等完整设计。nop-entropy是它的后端部分,采用java语言实现,可选择集成Spring框架或者Quarkus框架。中小企业可以免费商用
Java
7
0
openGauss-serveropenGauss-server
openGauss kernel ~ openGauss is an open source relational database management system
C++
131
185
RuoYi-Vue3RuoYi-Vue3
🎉 (RuoYi)官方仓库 基于SpringBoot,Spring Security,JWT,Vue3 & Vite、Element Plus 的前后端分离权限管理系统
Vue
873
517
Cangjie-ExamplesCangjie-Examples
本仓将收集和展示高质量的仓颉示例代码,欢迎大家投稿,让全世界看到您的妙趣设计,也让更多人通过您的编码理解和喜爱仓颉语言。
Cangjie
336
1.09 K
ohos_react_nativeohos_react_native
React Native鸿蒙化仓库
C++
179
264
cherry-studiocherry-studio
🍒 Cherry Studio 是一款支持多个 LLM 提供商的桌面客户端
TypeScript
607
59
note-gennote-gen
一款跨平台的 Markdown AI 笔记软件,致力于使用 AI 建立记录和写作的桥梁。
TSX
83
4