typescript-koa-postgresql 实现一个简单的rest风格服务器 —— 连接 postgresql 数据库...

接上一篇,这里使用 sequelize 来连接 postgresql 数据库

1、安装 sequelize,数据库驱动 pg

yarn add sequelize sequelize-typescript pg reflect-metadata

2、新建配置文件夹 conf 及 配置文件 db.conf.ts

/*** @name: 数据库配置* @param : undefined* @return : undefined*/ 
export const dbConfig = {host: 'localhost',database: 'demo',dialect: 'postgres',username: 'postgres',password: '123456'
}

3、连接数据库,新建文件夹 db 及 配置文件 db.ts

 1 /*
 2  * @Description: 数据库连接类
 3  */
 4 
 5 import * as path from 'path'
 6 import { Sequelize } from 'sequelize-typescript'
 7 import { dbConfig } from '../conf/db.conf'
 8 
 9 class DbContext {
10   private sequelize: Sequelize
11   constructor() {
12     const { host, database, dialect, username, password } = dbConfig
13     this.sequelize = new Sequelize({
14       host: host,
15       database: database,
16       dialect: dialect,
17       username: username,
18       password: password,
19       define: {
20         timestamps: true,  //开启时间戳 create_at delete_at update_at
21         paranoid: true,    //开启假删除
22         underscored: true, //下划线
23         charset: 'utf8',
24         freezeTableName: true //固定表名为单数  默认表名是xxxs
25       },
26       pool: {
27         max: 10,
28         min: 0,
29         acquire: 30000,
30         idle: 10000
31       },
32       timezone: '+08:00',
33       modelPaths: [path.resolve(__dirname, `./models`)]
34     })
35     this.sequelize.sync()
36   }
37   init(): Boolean {
38     return !!this.sequelize
39   }
40   getInstance(): Sequelize {
41     return this.sequelize
42   }
43   isInit(): Boolean {
44     return !!this.sequelize
45   }
46 }
47 export const dbContext = new DbContext()

4、数据库实体类,新建文件夹 models 及文件 user.ts

 1 /*
 2  * @Description: 数据库实体类
 3  */
 4 
 5 import { Table, Column, Model } from 'sequelize-typescript'
 6 
 7 @Table({
 8   tableName: 'user'
 9 })
10 export default class User extends Model<User> {
11   @Column({
12     comment: '自增ID',
13     primaryKey: true,
14     autoIncrement: true,
15   })
16   id: number
17 
18   @Column
19   username: string
20 
21   @Column
22   password: string
23 }

 5、编写业务逻辑接口,在 src 目录下新建文件夹 dao、service,在 dao 目录下新建 UserDao.ts 及子目录  impl,在 service  目录下新建 UserService.ts 及子目录  impl

 1 /*
 2  * @Description: 数据库表操作基础接口 UserDao.ts 
 3  */
 4 export interface UserDao {
 5   /**
 6    * @name: 查询
 7    * @param : 
 8    * @return : Array<User>
 9    */
10   findAll();
11   /**
12    * @name: 查询
13    * @param : 
14    * @return : Array<User>
15    */
16   findByName(username:string);
17   /**
18    * @name: 新增
19    * @param : undefined
20    * @return : undefined
21    */
22   create(entity:UserInfo);
23 
24   /**
25    * @name: 删除
26    * @param : undefined
27    * @return : undefined
28    */
29   delete(id:number);
30 }
31 export interface UserInfo {
32   username:string;
33   password:string;
34 }
 1 /*
 2  * @Description: service接口  UserService.ts
 3  * @version: 
 4  */
 5 
 6 export interface UserService{
 7   /**
 8    * @name: 查询
 9    * @param : undefined
10    * @return : undefined
11    */
12   findAll();
13   
14   /**
15    * @name: 查询
16    * @param : undefined
17    * @return : undefined
18    */
19   findByName(username:string);
20 
21   /**
22    * @name: 新增
23    * @param : undefined
24    * @return : undefined
25    */
26   create(username:string,password:string);
27 
28   /**
29    * @name: 删除
30    * @param : undefined
31    * @return : undefined
32    */
33   delete(id:String);
34 }

6、编写业务逻辑实现类 UserDaoImpl.ts、UserServiceImpl.ts

 1 /*
 2  * @Description: 数据库表操作基础实现类 UserDaoImpl.ts
 3  */
 4 
 5 import { dbContext } from '../../db/db'
 6 import { UserDao, UserInfo } from '../UserDao';
 7 import User from '../../db/models/user';
 8 
 9 export class UserDaoImpl implements UserDao{
10   constructor(){
11     dbContext.init();
12   }
13   /**
14    * @name: 查询
15    * @param : undefined
16    * @return : undefined
17    */
18   public async findAll(){
19     const results = await User.findAll({
20       raw: true
21     })
22     return results;
23   } 
24   
25    /**
26    * @name: 查询
27    * @param : undefined
28    * @return : undefined
29    */
30   public async findByName(username:string){
31     const results = await User.findOne({
32       where:{
33         username:username
34       }
35     })
36     return results;
37   } 
38 
39   /**
40    * @name: 新增
41    * @param : entity
42    * @return : undefined
43    */
44   public async create(entity:UserInfo) {
45     const results = await User.create(entity)
46     return results;
47   }
48   
49    /**
50    * @name: 删除
51    * @param : undefined
52    * @return : undefined
53    */
54   public async delete(id: number) {
55     const results = await User.destroy({
56       where:{
57           id:{
58             $eq:id
59           }
60       }
61     });
62     return results;
63   }
64 } 
 1 import { UserService } from "../UserService";
 2 import { UserDao } from "../../dao/UserDao";
 3 import { UserDaoImpl } from "../../dao/impl/UserDaoImpl";
 4 
 5 /*
 6  * @Description: service实现类 UserServiceImpl.ts
 7  */
 8 
 9 
10 export class UserServiceImpl implements UserService{
11   private userDao:UserDao;
12 
13   constructor(){
14     this.userDao = new UserDaoImpl();
15   }
16 
17   /**
18    * @name: 查询
19    * @param : undefined
20    * @return : undefined
21    */
22   public findAll() {
23     return this.userDao.findAll();
24   } 
25   /**
26    * @name: 查询
27    * @param : undefined
28    * @return : undefined
29    */
30   public findByName(username:string) {
31     return this.userDao.findByName(username);
32   } 
33   /**
34    * @name: 新增
35    * @param : entity
36    * @return : undefined
37    */
38   public create(username: string, password: string) {
39     return this.userDao.create({username,password});
40   }
41 
42   /**
43    * @name: 删除
44    * @param : undefined
45    * @return : undefined
46    */
47   public delete(id: String) {
48     return this.userDao.delete(~~id);
49   }
50  
51 } 

 7、查看成果,修改 router/index.ts

 1 /*
 2  * @Description: 后台路由组件
 3  * @version: 0.1.0
 4  */
 5 import * as Router from 'koa-router';
 6 import { UserInfo } from '../dao/UserDao';
 7 import { UserService } from '../service/UserService';
 8 import { UserServiceImpl } from '../service/impl/UserServiceImpl';
 9 
10 const router = new Router();
11 const userService:UserService =new UserServiceImpl();
12 
13 router.get('/*', async (ctx) => {
14   ctx.body = await userService.findAll();
15 })
16 
17 export { router }

8、浏览器输入 http://localhost:8080

 

至此连接数据库完成

 

目录结构:

转载于:https://www.cnblogs.com/lifefriend/p/10025469.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/248910.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SmartGit使用教程

说明 官网的客户端是命令行形式的&#xff0c;有兴趣可以去了解下。这里针对图形界面的smartgit做一个使用说明。 软件下载和安装 下载地址[2016.12.16测试可以] 按需选择,如果不知道自己电脑是什么系统的&#xff0c;那我没话说了https://www.syntevo.com/smartgit/ 安装 …

jquery 下拉框 select2 运用 笔记

1,添加select2 样式 参考&#xff08;https://select2.org/ &#xff09; 2,Html: <select id"txtType" name"Type" class"form-control select2" multiple"multiple"> </select> 3,jquery section scripts{ $(documen…

Asp.Net MVC中Action跳转小结

首先我觉得action的跳转大致可以这样归一下类&#xff0c;跳转到同一控制器内的action和不同控制器内的action、带有参数的action跳转和不带参数的action跳转。 一、RedirectToAction(“Index”);//一个参数时在本Controller下&#xff0c;不传入参数。 二、RedirectToAction(A…

获取浏览器屏幕高度(js,jq) - 进击的小牛牛 - 博客园

javascript IE中&#xff1a; document.body.clientWidth > BODY对象宽度 document.body.clientHeight > BODY对象高度 document.documentElement.clientWidth > 可见区域宽度 document.documentElement.clientHeight > 可见区域高度 FireFox中&#xff1a; docum…

589-N叉树的前序遍历

N阶二叉树&#xff1a; class Tree {public int val;public List<Tree> children;public Tree() {}public Tree(int _val, List<Tree> _children) {val _val;children _children;}}迭代法遍历&#xff1a;public List<Integer> preorder(Tree root) {List&…

解析URL参数

1、拿到一个完整url后&#xff0c;如何解析该url得到里面的参数。 /*** 解析url中参数信息&#xff0c;返回参数数组*/ function convertUrlQuery($query) {$queryParts explode(&, $query);$params array();foreach ($queryParts as $param) {$item explode(, $param);…

第一个爬虫和测试

Python测试函数的方法之一是用&#xff1a;try……except def gameover(a,b):if a>10 and b>10 and abs(a-b)2:return Trueif (a>11 and b<11) or (a<11 and b>11):return Truereturn False try:agameover(10,11)print(a) except:print("Error") g…

JS组件系列——Bootstrap 树控件使用经验分享 - 懒得安分 - 博客园

前言&#xff1a;很多时候我们在项目中需要用到树&#xff0c;有些树仅仅是展示层级关系&#xff0c;有些树是为了展示和编辑层级关系&#xff0c;还有些树是为了选中项然后其他地方调用选中项。不管怎么样&#xff0c;树控件都是很多项目里面不可或缺的组件之一。今天&#xf…

算法第4章实践报告

1.实践题目&#xff1a;最小删数问题 2.问题描述&#xff1a;给定n位正整数a&#xff0c;去掉其中任意k≤n 个数字后&#xff0c;剩下的数字按原次序排列组成一个新 的正整数。对于给定的n位正整数a和正整数 k&#xff0c;设计一个算法找出剩下数字组成的新数最 小的删数方案。…

Vue 下拉刷新及无限加载组件 - 有你便是晴天 - 博客园

原文 https://github.com/wangdahoo/vue-scroller 主题 Vue.js Vue Scroller Vue Scroller is a foundational component ofVonic UI. In purpose of smooth scrolling, pull to refresh and infinite loading. Demo Change Logs v0.3.9 add getPosition method for scr…

用java编程实现集合的交、并、差和补运算

一、实验目的 掌握集合的交、并、差和补运算&#xff0c;并且使用计算机编程实现。 二、实验内容 通过编程实现求给定集合A和B的并集C&#xff08;CA∪B&#xff09;、交集C&#xff08;CA∩B&#xff09;、差集C&#xff08;CA-B&#xff09;、补集~CE-C的运算。 三、实验要求…

node.js项目中常量的配置 - 个人文章 - SegmentFault 思否

在项目中&#xff0c;我们常将一些常量信息做成配置项&#xff0c;如&#xff0c;数据库的链接配置&#xff0c;业务错误代码配资等等。 我们通过两种方式可以解决该问题。 系统环境变量的方式 配置文件的方式 下边&#xff0c;将以这两方面进行展开。 1. 系统环境变量 No…

MySQL create table语法中的key与index的区别

在create table的语句中&#xff0c;key和index混淆在一起&#xff0c;官方手册中的解释是这样&#xff1a; KEY is normally a synonym for INDEX. The key attribute PRIMARY KEY can also be specified as just KEY when given in a column definition. This was implemente…

蓝桥杯 历届试题 九宫重排 (bfs+康托展开去重优化)

Description 如下面第一个图的九宫格中&#xff0c;放着 1~8 的数字卡片&#xff0c;还有一个格子空着。与空格子相邻的格子中的卡片可以移动到空格中。经过若干次移动&#xff0c;可以形成第二个图所示的局面。我们把第一个图的局面记为&#xff1a;12345678.把第二个图的局面…

DIV或者DIV里面的图片水平与垂直居中的方法 - 站住,别跑 - 博客园

DIV或者DIV里面的图片水平与垂直居中的方法 <div class“box”><img /> </div> 水平居中的常用方式&#xff1a; text-align:center ——这可以实现子元素字体&#xff0c;图片的水平居中。 margin:0 auto —— 这是针对块元素的水平居中方法 垂直居中的常…

spring boot的多环境部署

需求&#xff1a;不同的环境有不同的开关属性&#xff0c;比如开发系统&#xff0c;需要关闭短信&#xff0c;微信的通知功能。而演示环境&#xff0c;线上环境则需要打开这些配置。 那么&#xff0c;如何做到呢&#xff1f;---》在properties.application配置 需要在resources…

mybatis之动态SQL操作之查询

1&#xff09; 查询条件不确定&#xff0c;需要根据情况产生SQL语法&#xff0c;这种情况叫动态SQL /*** 持久层* author AdminTC*/ public class StudentDao {/*** 动态SQL--查询*/public List<Student> dynaSQLwithSelect(String name,Double sal) throws Exception{S…

设置图片元素上下垂直居中的7种css样式_赵一鸣博客

设置图片元素上下垂直居中的7种css样式 阅读(9548) 2018-07-15 14:13:34 图片、文字左右居中很简单&#xff0c;只需要以下代码&#xff1a; 1 text-align:center; 文字上下居中也很简单&#xff0c;假设外部div元素的高度是100px&#xff0c;那么&#xff1a; 1 line-heig…

zap+日志分级分文件+按时间切割日志整合demo

实现功能 info debug 级别的日志输出到 /path/log/demo.log     warn error .... 级别的日志输出到 /path/log/demo_error.log     日志自动按小时分割 最多保留7天的日志 依赖的第三方包github地址 https://github.com/uber-go/zap https://github.com/lestrrat-go/fi…

day36 Pyhton 网络编程03

一.内容回顾 socket通常也称作"套接字"&#xff0c;用于描述IP地址和端口&#xff0c;是一个通信链的句柄&#xff0c;应用程序通常通过"套接字"向网络发出请求或者应答网络请求。 socket起源于Unix&#xff0c;而Unix/Linux基本哲学之一就是“一切皆文件”…