美文网首页
Node - 数据库表结构初步设计

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

作者: 酷热summer | 来源:发表于2020-05-01 23:23 被阅读0次

    主要使用 node-postgres,它是一个 nodejs 的 postgres 的客户端。可以通过这个,启动服务,连接数据库,类似于 postgres 中的 pg_ctl命令。通过 js 语法,将一些服务器指令进行包装,达到可以操作数据库的效果。

    将数据库中的表结构体现到代码的逻辑里面,那么就需要一种关系的对应,比如,数据库中有个表 users,如果在代码中想使用 users 中的数据该如何处理呢?可以使用 pg 客户端,拿到某一用户的 id,使用 pg.connect(),然后运行 select 语句,将用户的信息全部拿出来,将获取到的对象全部返回出来。在其他的地方就可以直接使用了。此种方法存在一种弊病,在连接到数据库之前,就代码本身而言,无法直到数据库中的数据结构是怎么样的。最好的方法是,在代码中定义跟数据库内容对应的数据结构。简而言之,数据库中的数据结构,代码中也要保留一份。数据库是数据库的结构,代码也要有代码中的逻辑。

    此时,在 nodejs 应用比较广泛的 ORM 库(object relation mapping:对象关系映射): sequelizejssequelizejs 解决的是代码里和数据库表结构进行同步和操作的封装。

    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 - 数据库表结构初步设计

          本文链接:https://www.haomeiwen.com/subject/kgyqghtx.html