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 处理这些请求。作为开发者,你可能需要根据自己的数据模型和业务需求调整筛选和排序的逻辑。通过这种方式,可以构建一个强大的、支持查询、筛选、排序和分页的数据表格。

相关推荐
山山而川粤1 小时前
废品买卖回收管理系统|Java|SSM|Vue| 前后端分离
java·开发语言·后端·学习·mysql
真真假假々4 小时前
MySQL和ADSDB
数据库·mysql
秦老师Q4 小时前
MySQL第二章 sql约束与sql数据类型
数据库·sql·mysql
不是二师兄的八戒4 小时前
mysql in查询大数据量业务无法避免情境下优化
数据库·mysql
苹果醋34 小时前
vue3 在哪些方便做了性能提升?
java·运维·spring boot·mysql·nginx
mqiqe12 小时前
Python MySQL通过Binlog 获取变更记录 恢复数据
开发语言·python·mysql
工业甲酰苯胺12 小时前
MySQL 主从复制之多线程复制
android·mysql·adb
BestandW1shEs12 小时前
谈谈Mysql的常见基础问题
数据库·mysql
重生之Java开发工程师12 小时前
MySQL中的CAST类型转换函数
数据库·sql·mysql