查询接口
Sequelize 实例使用称为 **查询接口** 的机制与数据库进行方言无关的通信。 本手册中您所学到的方法大多是借助查询接口的多个方法实现的。
因此,查询接口中的方法是更底层的方法; 只有在您无法使用 Sequelize 中更高级的 API 完成操作时才应使用它们。 当然,它们仍然比直接运行原始查询(即手写 SQL)更高级。
本指南展示了一些示例,但要查看完整的方法列表以及每个方法的详细用法,请查看 查询接口 API。
获取查询接口
从现在开始,我们将使用 queryInterface
来指代 QueryInterface 类中的单例实例,它可以在您的 Sequelize 实例上访问
const { Sequelize, DataTypes } = require('sequelize');
const sequelize = new Sequelize(/* ... */);
const queryInterface = sequelize.getQueryInterface();
创建表
queryInterface.createTable('Person', {
name: DataTypes.STRING,
isBetaMember: {
type: DataTypes.BOOLEAN,
defaultValue: false,
allowNull: false,
},
});
生成的 SQL(使用 SQLite)
CREATE TABLE IF NOT EXISTS `Person` (
`name` VARCHAR(255),
`isBetaMember` TINYINT(1) NOT NULL DEFAULT 0
);
**注意:** 考虑定义一个模型并调用 YourModel.sync()
,这是一种更高级的方法。
向表添加列
queryInterface.addColumn('Person', 'petName', { type: DataTypes.STRING });
生成的 SQL(使用 SQLite)
ALTER TABLE `Person` ADD `petName` VARCHAR(255);
更改列的数据类型
queryInterface.changeColumn('Person', 'foo', {
type: DataTypes.FLOAT,
defaultValue: 3.14,
allowNull: false,
});
生成的 SQL(使用 MySQL)
ALTER TABLE `Person` CHANGE `foo` `foo` FLOAT NOT NULL DEFAULT 3.14;
删除列
queryInterface.removeColumn('Person', 'petName', {
/* query options */
});
生成的 SQL(使用 PostgreSQL)
ALTER TABLE "public"."Person" DROP COLUMN "petName";
在 SQLite 中更改和删除列
SQLite 不支持直接更改和删除列。 但是,Sequelize 会尝试使用备份表重建整个表来解决这个问题,其灵感来自 这些说明。
例如
// Assuming we have a table in SQLite created as follows:
queryInterface.createTable('Person', {
name: DataTypes.STRING,
isBetaMember: {
type: DataTypes.BOOLEAN,
defaultValue: false,
allowNull: false,
},
petName: DataTypes.STRING,
foo: DataTypes.INTEGER,
});
// And we change a column:
queryInterface.changeColumn('Person', 'foo', {
type: DataTypes.FLOAT,
defaultValue: 3.14,
allowNull: false,
});
以下是为 SQLite 生成的 SQL 调用
PRAGMA TABLE_INFO(`Person`);
CREATE TABLE IF NOT EXISTS `Person_backup` (
`name` VARCHAR(255),
`isBetaMember` TINYINT(1) NOT NULL DEFAULT 0,
`foo` FLOAT NOT NULL DEFAULT '3.14',
`petName` VARCHAR(255)
);
INSERT INTO `Person_backup`
SELECT
`name`,
`isBetaMember`,
`foo`,
`petName`
FROM `Person`;
DROP TABLE `Person`;
CREATE TABLE IF NOT EXISTS `Person` (
`name` VARCHAR(255),
`isBetaMember` TINYINT(1) NOT NULL DEFAULT 0,
`foo` FLOAT NOT NULL DEFAULT '3.14',
`petName` VARCHAR(255)
);
INSERT INTO `Person`
SELECT
`name`,
`isBetaMember`,
`foo`,
`petName`
FROM `Person_backup`;
DROP TABLE `Person_backup`;
其他
如本指南开头所述,Sequelize 中的查询接口功能远不止这些! 请查看 查询接口 API 获取所有可执行操作的完整列表。