📅  最后修改于: 2023-12-03 14:47:24.380000             🧑  作者: Mango
Sequelize 是一个支持多种数据库的 ORM 框架,它提供了许多有用的功能,比如模型定义、表关联、事务处理以及查询构建接口等。其中,Postgresql 是 Sequelize 支持的数据库之一,本文将重点介绍 Sequelize 在 Postgresql 数据库中的模式操作。
在数据库中,模式用来描述一个命名空间。一个模式可以包含许多表、视图、函数、序列以及其他对象。在 Postgresql 中,每个数据库都有一个默认模式叫做 public
,该模式下的所有对象都是公共的,任何用户都可以访问它。Sequelize 我们可以用它来创建自己的模式,并在其中创建表格。
创建模式非常简单,只需要使用 Sequelize 提供的 sequelize.createSchema
方法即可。
const sequelize = new Sequelize('database', 'username', 'password', {
dialect: 'postgres',
host: 'localhost'
});
sequelize.createSchema('myschema').then(() => {
console.log('schema created');
});
删除模式也很简单,只需要使用 Sequelize 提供的 sequelize.dropSchema
方法即可。
sequelize.dropSchema('myschema').then(() => {
console.log('schema droped');
});
在模式中,我们可以创建、修改、删除表格。下面将一一介绍这些操作。
创建表格,需要先定义表格的结构,比如表格的列、主键、外键等。Sequelize 的模型定义可以用来定义表格的结构,它支持多种数据类型,比如字符串、整数、日期、布尔值等。下面是一个简单的例子:
const User = sequelize.define('User', {
firstName: {
type: Sequelize.STRING,
allowNull: false
},
lastName: {
type: Sequelize.STRING
},
email: {
type: Sequelize.STRING,
allowNull: false,
unique: true
}
});
上述例子中,我们定义了一个 User 模型,它有三个属性:firstName、lastName 和 email,分别对应数据库中的三个列。其中,firstName 是必须的,因为我们设置了 allowNull: false
,email 是唯一的,因为我们设置了 unique: true
。当我们定义好模型之后,我们就可以通过 sync
方法来同步定义到数据库中。
sequelize.sync({ force: true }).then(() => {
console.log('table created');
});
上述例子中,我们设置了 force: true
,代表我们要先删除已存在的表格,然后重新创建新表格。在生产环境中,我们不应该使用 force:true
,而是应该采用迁移来更新数据库表结构。
对于已经存在的表格,我们可以通过模型定义来修改表格结构,有些修改需要手动执行 SQL 命令。
如果我们需要添加一个新列,我们可以通过模型定义来完成:
User.addColumn('age', {
type: Sequelize.INTEGER
});
上述例子中,我们添加了一个名为 age 的新列,类型为整数。
如果我们需要修改一个已有的列的定义,比如修改类型、默认值等,我们需要手动执行 SQL 命令。
sequelize.query(`
ALTER TABLE "Users" ALTER COLUMN "age" SET DEFAULT 0
`);
上述例子中,我们修改了 Users 表格中的 age 列的默认值为 0。
如果我们需要删除一个已有的表格,我们可以使用模型定义的 drop
方法:
User.drop();
在数据库中进行的一组操作,要么全部成功,要么全部失败,这种情况下就需要用到事务处理。Sequelize 提供了 sequelize.transaction
方法来创建事务,下面是一个例子:
sequelize.transaction((transaction) => {
return User.create({ firstName: 'John', lastName: 'Doe', email: 'johndoe@example.com' }, { transaction })
.then(() => {
return User.create({ firstName: 'Jane', lastName: 'Doe', email: 'janedoe@example.com' }, { transaction });
});
}).then(() => {
console.log('transaction committed');
}).catch((err) => {
console.error('transaction rolled back:', err);
});
上述例子中,我们创建了一个事务,后续两个 User 的创建操作都处于该事务中。如果其中一个操作失败,则整个事务都会回滚。
Sequelize 提供了多种查询构建工具,支持复杂的查询条件,比如嵌套查询、子查询、聚合查询等。下面是一个简单的例子:
User.findAll({
where: {
firstName: 'John'
}
}).then((users) => {
console.log(users);
});
上述例子中,我们查询了所有 firstName 为 John 的用户。Sequelize 提供了 findAll
、findOne
、findAndCountAll
等多种查询方法。除了查询方法外,Sequelize 还提供了诸如 limit
、offset
、order
、include
等查询工具。
本文介绍了 Sequelize 在 Postgresql 数据库中的模式操作,包括模式的创建、删除,表格的创建、修改、删除,事务处理以及查询构建工具的使用。Sequelize 是一个功能强大的 ORM 框架,对于 Node.js 的开发者来说,是一个不可或缺的工具。