Node - 数据库表结构初步设计

主要使用 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);
})

你可能感兴趣的:(Node - 数据库表结构初步设计)