Nodejs 操作 Sql Server
Nodejs 操作 Sql Server
Intro
最近项目需要爬取一些数据,数据有加密,前端的js又被混淆了,ajax请求被 hook 了,有些复杂,最后打算使用 puppeteer 来爬取数据。
Puppeteer 是谷歌团队在维护的一个项目,初衷主要是用来做网页的自动化测试, Google Chrome 团队官方的无界面(Headless)Chrome 工具,它是一个 Node 库,提供了一个高级的 API 来控制 DevTools协议上的无头版 Chrome ,也可以配置为使用完整(非无头)的 Chrome。这里就不详细介绍了,有兴趣的可以自己先行 Google 一下,之后再写一篇文章来介绍,今天主要介绍 node 操作 mssql。
node-mssql
node-mssql 是我们用来操作 Ms Sql Server 数据库用到的 npm 包,支持 promise, async/await 语法。这个包也是微软官方推荐使用的。
个人比较喜欢 async/await 语法。
基本用法:
let pool = await sql.connect(config);
// sql
let result1 = await pool.request()
.input('input_parameter', sql.Int, value)
.query('select * from mytable where id = @input_parameter');
// 存储过程
let result2 = await pool.request()
.input('input_parameter', sql.Int, value)
.output('output_parameter', sql.VarChar(50))
.execute('procedure_name');
更多用法请参考官方文档介绍 https://www.npmjs.com/package/mssql
封装
虽然提供比较完善的方法,但是如果用起来的话还是会觉得用起来有些不舒服,没有那么流畅,没有那么简洁,于是想自己封装一层
const mssql = require("mssql");
const log4js = require("log4js");
const logger = log4js.getLogger("dbUtil");
const connConfig = {
user: "db user",
password: "password",
server: "server",
database: "database name",
connectionTimeout: 120000,
requestTimeout: 3000000,
retryTimes: 3,
options: {
encrypt: true
},
pool: {
max: 1024,
min: 1,
idleTimeoutMillis: 30000
}
};
mssql.on('error', err => {
// ... error handler
logger.error(err);
});
let connectionPool;
var getConnection = async function(){//连接数据库
if(!(connectionPool && connectionPool.connected)) {
connectionPool = await mssql.connect(connConfig);
}
return connectionPool;
}
var querySql = async function (sql, params) {//写sql语句自由查询
await mssql.close();// close
var pool = await getConnection();
var request = pool.request();
if (params) {
for (var index in params) {
if (typeof params[index] == "number") {
request.input(index, mssql.Int, params[index]);
} else if (typeof params[index] == "string") {
request.input(index, mssql.NVarChar, params[index]);
}
}
}
var result = await request.query(sql);
await mssql.close();// close
return result;
};
var add = async function (addObj, tableName) {//添加数据
if(!addObj){
return;
}
await mssql.close();// close
var connection = await getConnection();
var request = connection.request();
var sql = "insert into " + tableName + "(";
for (var index in addObj) {
if (typeof addObj[index] == "number") {
request.input(index, mssql.Int, addObj[index]);
} else if (typeof addObj[index] == "string") {
request.input(index, mssql.NVarChar, addObj[index]);
}
sql += index + ",";
}
sql = sql.substring(0, sql.length - 1) + ") values(";
for (var index in addObj) {
if (typeof addObj[index] == "number") {
sql += "@" + index + ",";
} else if (typeof addObj[index] == "string") {
sql += "@" + index + ",";
}
}
sql = sql.substring(0, sql.length - 1) + ")";
var result = await request.query(sql);
await mssql.close();// close
return result;
};
var addIfNotExist = async function (addObj, whereObj, tableName) {//添加数据
if(!addObj){
return;
}
if(!whereObj){
return await add(addObj, tableName);
}
await mssql.close();// close
var connection = await getConnection();
var request = connection.request();
let sql = `BEGIN
IF NOT EXISTS (SELECT 1 FROM ${tableName} WHERE 1 > 0`;
for(var index in whereObj){
if (typeof addObj[index] == "number") {
request.input(index+'Where', mssql.Int, whereObj[index]);
} else if (typeof addObj[index] == "string") {
request.input(index+'Where', mssql.NVarChar, whereObj[index]);
}
sql += ` AND ${index} = @${index}Where`
}
sql+= ')';
sql += 'BEGIN ';
sql += "INSERT INTO " + tableName + "(";
for (var index in addObj) {
if (typeof addObj[index] == "number") {
request.input(index, mssql.Int, addObj[index]);
} else if (typeof addObj[index] == "string") {
request.input(index, mssql.NVarChar, addObj[index]);
}
sql += index + ",";
}
sql = sql.substring(0, sql.length - 1) + ") values(";
for (var index in addObj) {
if (typeof addObj[index] == "number") {
sql += "@" + index + ",";
} else if (typeof addObj[index] == "string") {
sql += "@" + index + ",";
}
}
sql = sql.substring(0, sql.length - 1) + ")";
sql += ` END
END`;
var result = await request.query(sql);
await mssql.close();// close
return result;
};
var addList = async function (addObjs, tableName) {//添加数据
if(!addObjs || addObjs.length == 0){
return;
}
await mssql.close();// close
var connection = await getConnection();
var sql = "INSERT INTO " + tableName + "(";
if (addObjs) {
let addObj = addObjs[0];
for (var index in addObj) {
sql += index + ",";
}
sql = sql.substring(0, sql.length - 1) + ") VALUES";
addObjs.forEach(addObj => {
sql = sql + "(";
for (var index in addObj) {
if (typeof addObj[index] == "number") {
sql += addObj[index] + ",";
} else if (typeof addObj[index] == "string") {
sql += "N'" + addObj[index] + "'" + ",";
}
}
sql = sql.substring(0, sql.length - 1) + "),";
});
}
sql = sql.substring(0, sql.length - 1);
// logger.info(sql);
var result = await connection.request().query(sql);
await mssql.close();// close
return result;
};
var update = async function (updateObj, whereObj, tableName) {//更新数据
await mssql.close();// close
var connection = await getConnection();
var request = connection.request();
var sql = "UPDATE " + tableName + " SET ";
if (updateObj) {
for (var index in updateObj) {
if (typeof updateObj[index] == "number") {
request.input(index, mssql.Int, updateObj[index]);
sql += index + "=@" + index + ",";
} else if (typeof updateObj[index] == "string") {
request.input(index, mssql.NVarChar, updateObj[index]);
sql += index + "=@" + index + ",";
}
}
}
sql = sql.substring(0, sql.length - 1) + " WHERE ";
if (whereObj) {
for (var index in whereObj) {
if (typeof whereObj[index] == "number") {
request.input(index, mssql.Int, whereObj[index]);
sql += index + "=@" + index + " AND ";
} else if (typeof whereObj[index] == "string") {
request.input(index, mssql.NVarChar, whereObj[index]);
sql += index + "=@" + index + " AND ";
}
}
}
sql = sql.substring(0, sql.length - 5);
var result = await request.query(sql);
await mssql.close();// close
return result;
};
exports.query = querySql;
exports.update = update;
exports.add = add;
exports.addIfNotExist = addIfNotExist;
exports.addList = addList;
Contact
Contact me: weihanli@outlook.com
Nodejs 操作 Sql Server的更多相关文章
- PHP操作SQL Server 2008/2012
PHP操作SQL Server驱动,微软官方提供2个版本,Version 2.0 和 Version 3.0 Version 2.0 版本支持的操作系统有: Windows Server 2003 S ...
- 使用php来访问操作sql server
使用php来访问操作sql server 在此分成三步走: 第一部:查看配置,下载文件 首先查看自己的php和sql server版本 Php文件输入echo PHP_VERSION 运行脚本就可以 ...
- SQL Server学习之路(七):Python3操作SQL Server数据库
0.目录 1.前言 2.准备工作 3.简单测试语句 4.提交与回滚 5.封装成类的写法 1.前言 前面学完了SQL Server的基本语法,接下来学习如何在程序中使用sql,毕竟不能在程序中使用的话, ...
- [转]C#操作SQL Server数据库
转自:C#操作SQL Server数据库 1.概述 ado.net提供了丰富的数据库操作,这些操作可以分为三个步骤: 第一,使用SqlConnection对象连接数据库: 第二,建立SqlComman ...
- 数据库SQL Server2012笔记(七)——java 程序操作sql server
1.crud(增删改查)介绍:create/retrieve/update/delete 2.JDBC介绍 1)JDBC(java database connectivity,java数据库连接) 2 ...
- Python 学习笔记:Python 操作 SQL Server 数据库
最近要将数据写到数据库里,学习了一下如何用 Python 来操作 SQL Server 数据库. 一.连接数据库: 首先,我们要连接 SQL Server 数据库,需要安装 pymssql 这个第三方 ...
- ORM之Dapper操作Sql Server和MySql数据库
1.为什么选择Dapper 1)轻量. 2)速度快.Dapper的速度接近与IDataReader,取列表的数据超过了DataTable. 3)支持多种数据库.Dapper可以在所有Ado.net P ...
- 基于Spring Boot,使用JPA操作Sql Server数据库完成CRUD
完成一个RESTful服务,提供几个访问接口,用来操作较简单的联系人信息,数据保存在Sql Server数据库中. 1.使用STS创建工程. 使用STS创建RESTful工程,可以参考: <用S ...
- c#操作SQL Server入门总结
我是一名c#新手.本文只是我是常学习的随笔. 一.下载SQL server软件 听说下载开发板是最好的(开发板如果只是用来学习.研究不算是侵权).在安装的时候,我也遇到了很多问题,在公司的电脑安装第一 ...
随机推荐
- 在vue中使用svg sprite
概述 这几天研究了一下在vue中使用svg sprite,有些心得,记录下来,供以后开发时参考,相信对其它人也有用. 在vue中导入svg 在vue中导入svg的方法有很多种,比如在img标签的src ...
- [Swift]LeetCode288. 唯一单词缩写 $ Unique Word Abbreviation
An abbreviation of a word follows the form <first letter><number><last letter>. Be ...
- android 缩放平移自定义View 显示图片
1.背景 现在app中,图片预览功能肯定是少不了的,用户基本已经形成条件反射,看到小图,点击看大图,看到大图两个手指开始进行放大,放大后,开始移动到指定部位~~~ 我相信看图的整个步骤,大家或者说用户 ...
- BBS论坛(九)
9.1.权限和角色模型定义 (1)cms/models class CMSPermission(object): ALL_PERMISSION = 0b11111111 # 1.访问者的权限 VISI ...
- java设计模式(1)---总则
设计模式总则 一.概述 1.什么是设计模式 设计模式是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结. 解释下: 分类编目:就是说可以找到一些特征去划分这些设计模式,从而进行分类. ...
- Python常见面试题
Q 1:Python 有哪些特点和优点? 作为一门编程入门语言,Python 主要有以下特点和优点: ● 可解释● 具有动态特性● 面向对象● 简明简单● 开源● 具有强大的社区支持当然,实际上 Py ...
- EF之Code First代码优先
1.前言 通过英文可知,表示的是代码优先,一般创建EF都是先创建数据库,创建根据数据库的EF实体模型,而code - first 则是反过来!... 2.代码实战 我们这次创建的不是原来的数据库EF设 ...
- asp.net core系列 33 EF查询数据 (2)
一. 原生SQL查询 接着上篇讲.通过 Entity Framework Core 可以在使用关系数据库时下降到原始 SQL 查询. 在无法使用 LINQ 表达要执行的查询时,或因使用 LINQ 查询 ...
- 前端笔记之JavaScript(三)关于条件判断语句、循环语句那点事
一.条件分支语句 条件分支语句,也叫作条件判断语句,就是根据某种条件执行某些语句,不执行某些语句. JS中有三种语法是可以表示条件分支的 1.1 if……else…… 条件分支的主力语法,这个主力语法 ...
- OKR与Scrum如何强强联手
我们收到很多问题询问如何把OKR和其他框架结合起来使用,以便管理组织的人员.流程和活动. 软件开发公司最喜欢用的框架之一就是Scrum,Scrum是一个诞生于20世纪90年代的软件开发框架,我们公司内 ...