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.NOW
或defaultValue: 'some default value'
。
3. allowNull
- 描述: 设置字段是否可以为
null
。 - 示例:
allowNull: false
表示字段不可为空。
4. unique
- 描述: 确保字段值在整个表中是唯一的。
- 示例:
unique: true
或unique: 'unique_constraint_name'
。
5. primaryKey
- 描述: 将字段设置为表的主键。
- 示例:
primaryKey: true
。
6. autoIncrement
- 描述: 对于整数字段,设置为自动递增。
- 示例:
autoIncrement: true
通常用于主键。
7. validate
- 描述: 为字段添加验证规则。
- 示例:
validate: { isEmail: true, notEmpty: true }
8. get
和 set
- 描述: 自定义字段的 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. onDelete
和 onUpdate
- 描述: 定义外键的级联行为。
- 示例:
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 端点来处理前端发送的请求:
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 来发送合适的请求并展示数据:
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 处理这些请求。作为开发者,你可能需要根据自己的数据模型和业务需求调整筛选和排序的逻辑。通过这种方式,可以构建一个强大的、支持查询、筛选、排序和分页的数据表格。