Sequelize进阶 Schema的使用

2024年 2月 2日 67.7k 0

1. Schema使用指南

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

1. 默认值 (Default Values)

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

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

2. 自定义 Getter 和 Setter

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

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 允许你在模型级别上添加验证。这些验证会在数据保存到数据库之前执行。

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

4. 虚拟字段 (Virtual Fields)

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

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

5. 钩子 (Hooks)

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

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

6. 索引

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

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

  • 描述: 为字段添加验证规则。
  • 示例:
    validate: {
      isEmail: true,
      notEmpty: true
    }
    

8. getset

  • 描述: 自定义字段的 getter 和 setter 函数。
  • 示例:
    get() {
      return this.getDataValue('fieldName');
    },
    set(value) {
      this.setDataValue('fieldName', value);
    }
    

9. field

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

10. references

  • 描述: 用于建立外键关系,指向另一个模型的字段。
  • 示例:
    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 端点来处理前端发送的请求:

  • 设置 Express 路由:
    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 来发送合适的请求并展示数据:

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

    相关文章

    Oracle如何使用授予和撤销权限的语法和示例
    Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
    下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
    社区版oceanbase安装
    Oracle 导出CSV工具-sqluldr2
    ETL数据集成丨快速将MySQL数据迁移至Doris数据库

    发布评论