扫码一下
查看教程更方便
Sequelize 实例使用一种称为 查询接口 的东西来以与方言无关的方式与数据库进行通信。 你在本教程中学到的大多数方法都是通过查询接口中的几种方法来实现的。
因此,查询接口中的方法是较低级的方法; 仅当找不到其他方法来使用 Sequelize 的高级 API 时,才应使用它们。 当然,它们比直接运行原始查询(即,手工编写SQL)的级别更高。
从现在开始,我们将 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', { /* 查询参数 */ });
生成 SQL (使用 PostgreSQL):
ALTER TABLE "public"."Person" DROP COLUMN "petName";
SQLite 不支持直接更改和删除列。 但是,Sequelize 将通过受这些说明的启发在备份表的帮助下重新创建整个表,以解决此问题。
示例:
// 假设我们在 SQLite 中创建了一个表,如下所示:
queryInterface.createTable('Person', {
name: DataTypes.STRING,
isBetaMember: {
type: DataTypes.BOOLEAN,
defaultValue: false,
allowNull: false
},
petName: DataTypes.STRING,
foo: DataTypes.INTEGER
});
// 我们改变一列:
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,以获取可以完成的操作的完整列表。