node项目操作数据库 (typeORM实践)

1,424 阅读4分钟

步骤简述

  1. 安装docker,使用docker命令安装数据库(本文以PostgreSQL为例),并且运行这个数据库方便开发调试
  2. 安装typeORM,然后添加ormconfig.json文件和package.json,也可以使用命令自动初始化配置,但是会覆盖掉本地package.json (超麻烦,懒得配的朋友直接抄这个demo的配置,改下数据库名称和其它信息就可以了)
  3. typeorm 创建表和实体
npx typeorm migration:create -n TableName //这个命令会在migration下生成一个ts文件用于创建表和删除表 (升级数据库|降级数据库)
typeorm migration:run // 用于创建表 (升级数据库)
typeorm migration:revert // 用于删除表 (降级数据库)

npx typeorm entity:create -n Post //这个命令会在entity下创建一个ts文件,用于将数据映射到实体 (就是方便我们到时候用EntityManager去操作数据)
  1. 使用API 操作数据库 代码示例
createConnection().then(async connection => {
    const posts = await connection.manager.find(Post)
    console.log(posts)
    const p = new Post()
    p.title = "test-post"
    p.content = "这是内容"
    await connection.manager.save(p)
    const posts2 = await connection.manager.find(Post)
    console.log(posts2)
    console.log("Inserting a new user into the database...");
    connection.close()

}).catch(error => console.log(error));

ORM介绍

ORM(Object Relation Model) 把数据库映射成对象。(本文使用typeorm)

数据库的表(table) --> 类(class)
记录(record,行数据)--> 对象(object)
字段(field)--> 对象的属性(attribute)

typeORM默认支持Typescript,支持关联,支持事务,支持数据库迁移。

命令行启动PostgreSQL

demo(可替换成自己的项目)
(在src新建blog-data目录,对应命令行中-v后面的blog-data,记得将该文件加入.gitignore)

mac
docker run -v "$PWD/blog-data":/var/lib/postgresql/data -p 5432:5432 -e POSTGRES_USER=blog -e POSTGRES_PASSWORD=xxxxxxxx -e POSTGRES_HOST_AUTH_METHOD=trust -d postgres:12.2
// 这里POSTGRES_PASSWORD=xxxxxxxx 密码可以成自定义的

旧版docker
docker run -v "blog-data":/var/lib/postgresql/data -p 5432:5432 -e POSTGRES_USER=blog -e POSTGRES_HOST_AUTH_METHOD=trust -d postgres:12.2


docker exec -it 容器id bash//进入容器
psql -U blog -W//没有设置密码直接回车进入
pg命令
\l 查看数据库
\c 连接数据库
\dt 进入表

创建数据库

用SQL来创建数据库,因为TypeORM没有单纯提供创建数据库的API
我们需要创建三个数据库:开发(develpoment_blog)、测试(test_blog)、生产(production_blog)

//命令
CREATE DATABASE DataBaseName;

安装依赖typeORM

yarn add typeorm reflect-metadata @types/node pg

初始化typeORM

记得提交代码,init覆盖packge.json等文件 (嫌麻烦,抄demo的配置)

./node_modules/.bin/typeorm init --database postgres
或者
npx typeorm init --database postgres
git checkout .gitignore //撤销init对.gitignore的更改
git checkout package.json //撤销init对package.json 更改

配置ormconfig.json
如果是tool box用户host:填写docker ip (docker-machine.exe ip 获得docker ip)
database:对应的文件名(如:填写我们刚才新建的develpoment_blog)
填写username/password

配置tsconfig

"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"strict": false,

编译typeorm运行的坑

以next.js为例,部分框架内置了babel来将TS编译为JS,TypeORM推荐使用ts-node 来编译,这两者对TS的支持并非完全一致,所以我们要进行统一(全部使用babel),其它的框架可以查找对应的解决方式。

如何运行src/index.ts

安装@babel/cli

yarn add @babel/cli
yarn add -D @babel/plugin-proposal-decorators

新建.babelrc 配置如下

{
    "presets": [
        "next/babel"
    ],
    "plugins": [
        [
            "@babel/plugin-proposal-decorators",
            {
                "legacy": true
            }
        ]
    ]
}

编译成功

npx babel ./src --out-dir dist --extensions ".ts,.tsx" 
node dist/index.js //成功运行,说明编译成功

新增scripts指令(便于typerom打包,升级数据库,降级数据库)

 "typeorm:build": "babel ./src --out-dir dist --extensions .ts,.tsx",
 "migration:run": "typeorm migration:run",
 "migration:revert": "typeorm migration:revert"

截屏2021-05-09 下午7.53.56.png

禁用sync

ormconfig.json修改配置
"synchronize": false,如果为true,那么在链接数据库时,typeorm会自动根据entity目录来修改数据表,看起来很方便,但该功能可能会在我们修改User的时候造成数据丢失。

创建表

npx typeorm migration:create -n CreatePost
//在migration目录中会生成一个接口文件

截屏2021-05-09 下午2.51.05.png

添加colums

截屏2021-05-22 下午2.00.55.png

windows同时运行两个任务npm run tasks in parallel

如果你同时开多个终端没有影响可不看

yarn add --dev concurrently
package.json 配置scripts格式("concurrently \"task 1\" \"task 2\"""dev": "concurrently \"next dev\" \"babel -W ./src --out-dir dist --extensions .ts,.tsx\"",//例子

操作表 (数据映射到实体)

以上大多是配置,只是在数据库中创建了Post,下面将数据映射到Entity

"entity:create": "typeorm entity:create -n Post"

截屏2021-05-09 下午11.26.25.png

使用实体的两种方式

EntityManager Api

截屏2021-05-10 下午11.17.53.png 相关Api

截屏2021-05-10 下午11.21.16.png

Repository Api

截屏2021-05-10 下午11.29.18.png

添加密钥

将涉及隐私的密钥存入process.env.SECRET

export SECRET=4828a830-5b50-4ae8-b090-c6c967223d7f