主要使用 node-postgres,它是一个 nodejs 的 postgres 的客户端。可以通过这个,启动服务,连接数据库,类似于 postgres 中的
pg_ctl
命令。通过 js 语法,将一些服务器指令进行包装,达到可以操作数据库的效果。
将数据库中的表结构体现到代码的逻辑里面,那么就需要一种关系的对应,比如,数据库中有个表 users,如果在代码中想使用 users 中的数据该如何处理呢?可以使用 pg 客户端,拿到某一用户的 id,使用 pg.connect(),然后运行 select 语句,将用户的信息全部拿出来,将获取到的对象全部返回出来。在其他的地方就可以直接使用了。此种方法存在一种弊病,在连接到数据库之前,就代码本身而言,无法直到数据库中的数据结构是怎么样的。最好的方法是,在代码中定义跟数据库内容对应的数据结构。简而言之,数据库中的数据结构,代码中也要保留一份。数据库是数据库的结构,代码也要有代码中的逻辑。
此时,在 nodejs 应用比较广泛的 ORM 库(object relation mapping:对象关系映射): sequelizejs。sequelizejs
解决的是代码里和数据库表结构进行同步和操作的封装。
1.创建表
npm install --save sequelize
在 postgresql 目录下创建 sequelize_demo.js
:
const Sequelize = require('sequelize');
const sequelize = new Sequelize({
dialect: "postgres", // 数据库类型
database: "pg_playground" // 数据库名称
});
module.exports = {
Sequelize,
sequelize
};
在 postgresql 目录下创建 sq_model_demo.js
:
const { Sequelize, sequelize } = require("./sequelize_demo");
// 定义表 post 并指定数据结构,并没有做任何表的操作
const PostModel = sequelize.define("post", {
title: {
type: Sequelize.DataTypes.STRING(64)
},
content: {
type: Sequelize.DataTypes.TEXT
},
created: {
type: Sequelize.DataTypes.TIME
}
})
// 将数据结构同步到数据库中
PostModel.sync();
然后在终端运行 node sq_model_demo.js
,报错 Please install pg package manually
,查看官方文档,需要手动的安装所选择的数据库驱动,执行指令:
# One of the following:
$ npm install --save pg pg-hstore # Postgres // 在终端执行这条指令即可
$ npm install --save mysql2
$ npm install --save mariadb
$ npm install --save sqlite3
$ npm install --save tedious # Microsoft SQL Server
重新执行 node sq_model_demo.js
,提示创建表 posts 成功。连接数据库后,输入 \d
可看到增加了 posts
表,可输入指令 \d posts
查看表的详情。
2.向表中插入数据
sq_model_demo.js
中继续添加以下代码:
(async () => {
const created = await PostModel.create({
title: "第一篇标题",
content: "第一篇内容"
})
})().then(() => {
console.log("成功");
}).catch(e => {
console.log("创建失败");
console.log(e);
})
终端执行 node sq_model_demo.js
后,使用指令 select * from posts;
可查看刚刚插入的数据。
3. 数据查询
- 查询所有数据
// 查询数据
(async () => {
const result = await PostModel.findAll(); // 返回的 result 为数组,数组中的 dataValues 为每条数据中的具体内容
console.log(result[0].dataValues);
})().then(() => {
console.log("成功");
}).catch(e => {
console.log("创建失败");
console.log(e);
})
- 查询某一条数据
// 查询某一条数据
(async () => {
const result = await PostModel.findOne({
attributes: ["title"], // 相当于 select title from xxx 中的 title
where: {
title: "第一篇标题"
}
});
console.log(result.dataValues);
})().then(() => {
console.log("成功");
}).catch(e => {
console.log("创建失败");
console.log(e);
})
- 查询多条数据
const { Op } = Sequelize;
(async () => {
const result = await PostModel.findAll({
where: {
id: {
[Op.gte]: 2 // 查询id >=2 的数据,[Op.eq]: 1,表示查询 id 为1 的数据
}
}
});
console.log(result.map(item => item.dataValues));
})().then(() => {
console.log("成功");
process.exit(0);
}).catch(e => {
console.log("创建失败");
console.log(e);
process.exit(1);
})
网友评论