步骤简述
- 安装docker,使用docker命令安装数据库(本文以PostgreSQL为例),并且运行这个数据库方便开发调试
- 安装typeORM,然后添加ormconfig.json文件和package.json,也可以使用命令自动初始化配置,但是会覆盖掉本地package.json (超麻烦,懒得配的朋友直接抄这个demo的配置,改下数据库名称和其它信息就可以了)
- typeorm 创建表和实体
npx typeorm migration:create -n TableName //这个命令会在migration下生成一个ts文件用于创建表和删除表 (升级数据库|降级数据库)
typeorm migration:run // 用于创建表 (升级数据库)
typeorm migration:revert // 用于删除表 (降级数据库)
npx typeorm entity:create -n Post //这个命令会在entity下创建一个ts文件,用于将数据映射到实体 (就是方便我们到时候用EntityManager去操作数据)
- 使用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"
禁用sync
ormconfig.json修改配置
"synchronize": false,如果为true,那么在链接数据库时,typeorm会自动根据entity目录来修改数据表,看起来很方便,但该功能可能会在我们修改User的时候造成数据丢失。
创建表
npx typeorm migration:create -n CreatePost
//在migration目录中会生成一个接口文件
添加colums
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"
使用实体的两种方式
EntityManager Api
相关Api
Repository Api
添加密钥
将涉及隐私的密钥存入process.env.SECRET
export SECRET=4828a830-5b50-4ae8-b090-c6c967223d7f