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.pswp.cn/news/248910.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/248910.shtml
英文地址,請注明出處:http://en.pswp.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基本哲學之一就是“一切皆文件”…