Sequelize进阶 Schema的使用

1. Schema使用指南

在 Sequelize 中,模式(Schema)的使用涉及到定义数据表的结构,包括字段的类型、约束、索引以及默认值等。以下是一些高级用法的详细叙述:

1. 默认值 (Default Values)

在 Sequelize 中,你可以为模型字段设置默认值。这对于当记录被创建而没有指定某些字段时非常有用。

javascript 复制代码
const User = sequelize.define('user', {
  username: {
    type: Sequelize.STRING,
    defaultValue: 'NewUser'
  },
  createdAt: {
    type: Sequelize.DATE,
    defaultValue: Sequelize.NOW
  }
});

2. 自定义 Getter 和 Setter

Sequelize 允许你定义自定义的 getter 和 setter 方法,这可以用于格式化数据或在数据保存到数据库之前对其进行加工。

javascript 复制代码
const User = sequelize.define('user', {
  firstName: {
    type: Sequelize.STRING,
    allowNull: false,
    get() {
      const rawValue = this.getDataValue('firstName');
      return rawValue ? rawValue.toUpperCase() : null;
    }
  },
  lastName: {
    type: Sequelize.STRING,
    set(value) {
      this.setDataValue('lastName', value.trim());
    }
  }
});

3. 验证

Sequelize 允许你在模型级别上添加验证。这些验证会在数据保存到数据库之前执行。

javascript 复制代码
const User = sequelize.define('user', {
  email: {
    type: Sequelize.STRING,
    allowNull: false,
    validate: {
      isEmail: true
    }
  }
});

4. 虚拟字段 (Virtual Fields)

虚拟字段是不会保存到数据库中的字段,但可以在模型中定义,并且可以像常规属性一样使用。

javascript 复制代码
const User = sequelize.define('user', {
  firstName: Sequelize.STRING,
  lastName: Sequelize.STRING,
  fullName: {
    type: Sequelize.VIRTUAL,
    get() {
      return `${this.firstName} ${this.lastName}`;
    }
  }
});

5. 钩子 (Hooks)

Sequelize 提供了多种钩子,允许你在数据保存、更新或删除等操作的不同阶段运行自定义逻辑。

javascript 复制代码
const User = sequelize.define('user', {
  username: Sequelize.STRING
}, {
  hooks: {
    beforeCreate: (user, options) => {
      user.username = user.username.toLowerCase();
    }
  }
});

6. 索引

你可以在模型定义中指定索引,这有助于提高数据库查询的性能。

javascript 复制代码
const User = sequelize.define('user', {
  username: Sequelize.STRING,
  email: Sequelize.STRING
}, {
  indexes: [
    {
      unique: true,
      fields: ['email']
    }
  ]
});

这些高级用法提供了强大的灵活性和控制力,使得 Sequelize 成为一个功能丰富的 ORM(对象关系映射)工具。通过这些用法,你可以更好地定义和操作你的数据模型。

2. Schema常用配置说明

在 Sequelize 中,定义模型时可以为每个字段(属性)指定多种配置项。以下是一些常见的属性及其详细说明:

1. type

  • 描述: 指定字段的数据类型。
  • 示例 : Sequelize.STRING, Sequelize.INTEGER, Sequelize.DATE 等。

2. defaultValue

  • 描述: 为字段指定默认值。
  • 示例 : defaultValue: Sequelize.NOWdefaultValue: 'some default value'

3. allowNull

  • 描述 : 设置字段是否可以为 null
  • 示例 : allowNull: false 表示字段不可为空。

4. unique

  • 描述: 确保字段值在整个表中是唯一的。
  • 示例 : unique: trueunique: 'unique_constraint_name'

5. primaryKey

  • 描述: 将字段设置为表的主键。
  • 示例 : primaryKey: true

6. autoIncrement

  • 描述: 对于整数字段,设置为自动递增。
  • 示例 : autoIncrement: true 通常用于主键。

7. validate

  • 描述: 为字段添加验证规则。

  • 示例 :

    javascript 复制代码
    validate: {
      isEmail: true,
      notEmpty: true
    }

8. getset

  • 描述: 自定义字段的 getter 和 setter 函数。

  • 示例 :

    javascript 复制代码
    get() {
      return this.getDataValue('fieldName');
    },
    set(value) {
      this.setDataValue('fieldName', value);
    }

9. field

  • 描述: 指定数据库中对应的列名称(如果与模型中的字段名不同)。
  • 示例 : field: 'column_name_in_database'

10. references

  • 描述: 用于建立外键关系,指向另一个模型的字段。

  • 示例 :

    javascript 复制代码
    references: {
      model: 'OtherModel',
      key: 'id'
    }

11. onDeleteonUpdate

  • 描述: 定义外键的级联行为。
  • 示例 : onDelete: 'CASCADE', onUpdate: 'NO ACTION'

12. comment

  • 描述: 为字段添加注释。
  • 示例 : comment: 'This is a comment'

13. typeValidation

  • 描述: 启用数据类型级别的验证。
  • 示例 : typeValidation: true

这些属性提供了丰富的配置选项,可以让你详细地定义你的数据模型,确保数据的完整性和正确性。通过合理运用这些属性,可以创建出既强大又灵活的数据库模式。

3. Sequelize的Schema配合Antd ProTable

要使用 Sequelize 和 Ant Design Pro Table 实现一个集成查询、筛选、排序和分页功能的前后端数据交互,你需要在前端设置好 Pro Table,并在后端配置 Sequelize 来处理相应的请求。以下是大致的步骤:

后端 (使用 Sequelize)

假设有一个名为 Item 的 Sequelize 模型,需要创建一个 API 端点来处理前端发送的请求:

  1. 设置 Express 路由 :

    javascript 复制代码
    app.get('/api/items', async (req, res) => {
      // 使用 req.query 获取前端发送的参数
      const { current, pageSize, sorter, filter } = req.query;
    
      // 处理分页
      const limit = pageSize ? parseInt(pageSize) : 10;
      const offset = current ? (current - 1) * limit : 0;
    
      // 处理排序
      let order = [];
      if (sorter) {
        // 假设 sorter 格式为 'field_desc' 或 'field_asc'
        const [field, orderType] = sorter.split('_');
        order.push([field, orderType.toUpperCase()]);
      }
    
      // 处理筛选
      // 这里的 filter 处理取决于你的具体逻辑
    
      // 构建查询参数
      const options = {
        where: filter,
        order: order,
        offset: offset,
        limit: limit,
      };
    
      // 查询数据
      try {
        const { count, rows } = await Item.findAndCountAll(options);
        res.json({
          data: rows,
          total: count,
          success: true,
        });
      } catch (error) {
        res.status(500).send({ message: error.message });
      }
    });

前端 (使用 Ant Design Pro Table)

在前端,需要配置 Pro Table 来发送合适的请求并展示数据:

  1. 配置 Pro Table :

    jsx 复制代码
    import ProTable from '@ant-design/pro-table';
    
    const TableList = () => {
      const columns = [
        // 定义列
        { title: 'Name', dataIndex: 'name', sorter: true, filter: true },
        // 更多列...
      ];
    
      return (
        <ProTable
          columns={columns}
          request={async (params, sorter, filter) => {
            // 处理 params,sorter,filter 以匹配后端 API
            const requestParams = {
              ...params,
              sorter: Object.keys(sorter).length ? `${Object.keys(sorter)[0]}_${sorter[Object.keys(sorter)[0]]}` : '',
              filter: filter,
            };
    
            // 发送请求到后端
            const response = await fetch('/api/items', {
              method: 'GET',
              params: requestParams,
            });
            const data = await response.json();
    
            return {
              data: data.data,
              success: data.success,
              total: data.total,
            };
          }}
          rowKey="id"
          pagination={{
            pageSize: 10,
          }}
          search={{
            filterType: 'light',
          }}
        />
      );
    };
    
    export default TableList;

这个示例展示了如何在前端使用 Pro Table 发送请求,并在后端使用 Sequelize 处理这些请求。作为开发者,你可能需要根据自己的数据模型和业务需求调整筛选和排序的逻辑。通过这种方式,可以构建一个强大的、支持查询、筛选、排序和分页的数据表格。

相关推荐
玄斎9 小时前
MySQL 单表操作通关指南:建库 / 建表 / 插入 / 增删改查
运维·服务器·数据库·学习·程序人生·mysql·oracle
编程小Y9 小时前
MySQL 与 MCP 集成全解析(核心原理 + 实战步骤 + 应用场景)
数据库·mysql·adb
lvbinemail10 小时前
Grafana模板自动复制图表
数据库·mysql·zabbix·grafana·监控
weixin_4481199411 小时前
Datawhale Hello-Agents入门篇202512第1次作业
数据库·sql·mysql
皮皮林55111 小时前
有了开源的 MySQL,为什么还要选择 PostgreSQL?
mysql
廋到被风吹走12 小时前
【数据库】【MySQL】分库分表策略 分类、优势与短板
数据库·mysql·分类
五阿哥永琪14 小时前
MySQL 慢查询定位与 SQL 性能优化实战指南
sql·mysql·性能优化
xiaok17 小时前
GROUP BY进阶用法
mysql
李慕婉学姐17 小时前
【开题答辩过程】以《基于Android的健康助手APP的设计与实现》为例,不知道这个选题怎么做的,不知道这个选题怎么开题答辩的可以进来看看
android·java·mysql
qq_124987075317 小时前
基于springboot健康养老APP的设计与实现(源码+论文+部署+安装)
java·spring boot·后端·mysql·微信小程序·毕业设计