npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

db-sql

v1.0.0

Published

db-sql,mysql,db,orm

Downloads

2

Readme

db-sql是一个node 操作mysql 增删改查的一个库,使用typescript编写,所以支持typescript,编译后是commonjs 规范,对应也有声明文件,用法简单,依赖模块 mysql,sql的防注入利用的是mysql模块的方法转义,默认是用链接池进行连接 要求 node>7.6 ,使用了 async 方法,所有的方法执行sql操作后,返回的是Primose.resolve([err,data]),err:是错误,data:是执行sql操作的结果

  • 查询

    • select():查所有数据
    • findOne():查一条数据
    • pageSelect():分页查询
  • 增加

    • add():单个、批量添加
    • thenAdd(): where条件查询后不存在则添加
  • 更新

    • update():单个更新
    • updateMany():批量更新
    • thenUpdate():按where条件查询后数据不存在
  • 删除

    • delete():一定要结合where使用
  • 聚合函数

    • min():最小值
    • max():最大值
    • count():总个数
    • sum():总和
    • avg():平均数
  • 事务

    • transaction():
  • 原始方法

    • execsql()

    • 参数转义 escape()

例子:


let dbModel = require("db-sql");
    // 创建实例
    let db = new dbModel({
        host:"127.0.0.1",
        user:"root",
        password:"123456",
        port:3306,
        database:"thinkjs"
    })
    db.pool.on("connection",function(){
        console.log("连接成功")
    })
    db.pool.on("error",function(){
        console.log("连接失败")
    })

注意:返回的是Primose.resolve([err,data])

1、select():查询数据

 (async ()=>{
    let [err1,data1]= await db.select({table:'tk_tab'}) 
    // sql=>select * from tk_tab
    console.info(err1,data1)
  })()

2、findOne():查询一条数据

 (async ()=>{
    let [err2,data2]= await db.findOne({table:'tk_tab'})
     // sql=>select * from tk_tab  limit  1
    console.info(err2,data2)
  })()

3、options.field:{string|array},指定字段查询

 (async ()=>{
   let [err3,data3]= await db.select({table:'tk_tab',field:"id,name"}) 
     // sql=>select id,name from tk_tab
    console.info(err3,data3)
  })()

4、options.where(option):{string|object|array} 按条件查询

 (async ()=>{
    //(4.1):string
    let [err41,data41]= await db.select({table:'tk_tab',where:"id=1"})
    // sql=>select * from tk_tab  where  id = 1
    console.info(err41,data41)

    //(4.2):object
    let [err42,data42]= await db.select({table:'tk_tab',where:{id:1}})
    // sql=>select * from tk_tab  where  id = 1
    console.info(err42,data42)

    //(4.3):Array:(数组第最后一个元素可以是:"or"|“and" 或者是依然是where 字段条件)string|object
    let [err43,data43]= await db.select({table:'tk_tab',where:[{id:1},{id:5},{id:2},"or"]})
    // sql=>select * from tk_tab  where  id = 1 or id=5 or id=3
    console.info(err43,data43)

    //(4.4):option.__logic   or=>或者,and =>且
    let [err44,data44]= await db.select({table:'tk_tab',where:[{id:1,name:'视频',__logic:'or'},{id:2},"or"]})
    // sql=>select * from tk_tab  where  (  id = 1 or   name = '视频'   )  or  (  id = 2   )
    console.info(err44,data44)

    //(4.5):option.__complex   复合查询(相对复杂的)
    let [err45,data45]= await db.select({table:'tk_tab',where:[{id:1,"__logic":"OR",__complex:{name:'视频',id:10}},{id:2},"or"]})
    // sql=>select * from tk_tab  where  ( ( id = 1) or ( name = '视频' and   id = 10 )  )  or  (  id = 2   )
    console.info(err45,data45)

    //(4.6): like,notlike 模糊搜索,字段:值(数组:第一元素是关键词如like,第二个元素是条件值,第三个是or,and 可选,默认or)
    let [err46,data46]= await db.select({table:'tk_tab',where:{name:["like",["%频%",'%诗%'],"and"]}})
    //res=>sql:select * from tk_tab  where  ( name like '%频%' and name like '%诗%' )
    console.info(err46,data46)


    //(4.7):BETWEEN,NOT BETWEEN
    let [err47,data47]= await db.select({table:'tk_tab',where:{id:["BETWEEN",["1","3"]]}})
    //res=>sql: select * from tk_tab  where  ( id  between '1' and '3' );
    console.info(err47,data47)


    //(4.8):IN,NOTIN
    let [err48,data48]= await db.select({table:'tk_tab',where:{id:["IN",["1",2,"3"]]}})
        //res=>sql:select * from tk_tab  where  id in ( '1',2,'3' ) ;
        console.info(err48,data48)

    //(4.9): =,!= ,>,>=,<,<= ;
    let [err49,data49]= await db.select({table:'tk_tab',where:{id:["!=",2]}})
    //res=>sql:select * from tk_tab  where  id  != 2
    console.info(err49,data49)
  })()

5、options.order:{string|object:array}; 排序:(asc:升,desc:降)

 (async ()=>{
    //(1): string=>"name desc";
    //(2):object=>{"name":'desc',id:"asc"};
    //(3):array=>['name desc","id asc"]
    let [err5,data5]= await db.select({table:'tk_tab',order:'id desc'})
    // res=>sql:select * from tk_tab  order by id desc;
    console.log(err5,data5)
  })()

6、option.limit:{number|string|number[]|{page:number,offset:number}} 查询指定限制个数

  • 一个参数(offset): 从第一条开始 查 offset 条
  • -两个参数(page,offset):page:从第(page-1)*offset 条开始,查 offset 条
 (async ()=>{
    // (1).string:"2,10";
    // (2).object:{"page":0,"offset":10};
    // (3).array:[3,2]
    let [err6,data6]= await db.select({table:'tk_tab',limit:[3,2]})
    // res=>sql:select * from tk_tab  limit 4,2;
    console.log(err6,data6)
  })()

7、options.group:{string};分组

 (async ()=>{
    let [err7,data7]= await db.select({table:'tk_tab',field:'status',group:"status"})
    // res=>sql:select status from tk_tab  group by status
    console.log(err7,data7)
  })()

8、 options.hvaing:结合group 方法一起,用法和 where一样

 (async ()=>{
    let [err8,data8]= await db.select({table:'tk_tab',field:'status',group:"status",having:{ status:1}})
    //res=>sql:select status from tk_tab  group by status  having  status = 1
    console.log(err8,data8)
  })()

9、options.join:string|object|array;连接查询:分为左右连接,内连接

 (async ()=>{

    //(9.1).string: "right join tk_cate as c on a.cid=c.id"
    let [err91,data91]= await db.select({table:'tk_article as a',join:'left join tk_cate as c on a.cid=c.id'})
    //res=>sql:select * from tk_article as a left join tk_cate as c on a.cid=c.id;
    console.log(err91,data91)


    //(9.2).object:{table,join,on}=>{table:"tk_cate as c",join:"right",on:"a.cid=c.id"}
    let [err92,data92]= await db.select({table:'tk_article as a',join:{table:"tk_cate as c",join:"left",on:"a.cid=c.id"}})
    //res=>sql:select * from tk_article as a left join tk_cate as c on a.cid=c.id;
    console.log(err92,data92)

    //(9.3).array:[string|object],多个join ,可用数组
    let [err93,data93]= await db.select({table:'tk_tab_article as at',join:
        [
            {table:"tk_article as a",join:"left",on:"at.a_id=a.id"},
            {table:"tk_tab as t",join:"left",on:["at.t_id","t.id"]}
        ] })
    //res=>sql:select * from tk_tab_article as at left join tk_article as a on at.a_id=a.id left join tk_tab as t on at.t_id = t.id
    console.log(err93,data93)

10、 options.distinct:string,去重字段

 (async ()=>{

     let [err10,data10]= await db.select({table:'tk_tab',field:'name',distinct:"name"})
    // res=>sql: select distinct  name from tk_tab
    console.log(err10,data10)

  })()

101、options.build:直接返回sql语句,不是[err,data] 数组形式

 (async ()=>{

    let sql101= await db.select({table:'tk_tab',field:'id,name',build:true})
    let sql102= await db.update({table:'tk_tab',values:{name:"465789"},where:{id:60},build:true})

  })()

11、add():values:{string|object|array },添加数据,单条、批量

 (async ()=>{

   let [err11_1,data11_1]= await db.add({table:'tk_tab',values:{name:"tab-1",createtime:new Date().getTime()}});
    // res=>sql: insert into tk_tab  set name='tab-1',createtime=1599804955469
    console.log(err11_1,data11_1)

    let [err11_2,data11_2]= await db.add({table:'tk_tab',values:
        [{name:"tab-2",createtime:new Date().getTime()},
        {name:"tab-3",createtime:new Date().getTime()}]
    })
    // res=>sql: insert into tk_tab  ( name,createtime ) values ('tab-2',1599804955476) , ('tab-3',1599804955476)
    console.log(err11_2,data11_2)
   
  })()

12、update():values=>object;更新数据单条,为了防止更新全部,必须要写where 条件,where 为true 忽略更新条件

 (async ()=>{

    let [err12_1,data12_1]= await db.update({table:'tk_tab',values:{status:0},where:true}) ;//更新全部,
    //res=>sql:update tk_tab  set status=0
    console.info(err12_1,data12_1)

    let [err12_2,data12_2]= await db.update({table:'tk_tab',values:{status:1},where:{id:[">",10]}}) ;
    //res=>sql:update tk_tab  set status=1  where  id  > 10
    console.info(err12_2,data12_2)
   
  })()

13、updateMany():values=>object[];批量更新,where=>{key:string}指定更新条件的字段如id

 (async ()=>{

    let [err13,data13]= await db.updateMany({table:'tk_tab',values:[{id:26,name:"tab1-1",status:2},{id:27,name:"tab2-1",status:2}],where:{key:'id'}}) 
    //res=>sql:update tk_tab set  name = case id  when 26 then  'tab1-1'   when 27 then  'tab2-1'  end , status = case id  when 26 then  2   when 27 then  2  end  where  id in (26,27)
    console.info(err13,data13)
   
  })()

14、delete() 删除,为了防止误操作,where 添加必须加上,where 为true 忽略删除条件

 (async ()=>{

    let [err14_2,data14_2]= await db.delete({table:'tk_tab',where:true});//删除全部
    let [err14_1,data14_1]= await db.delete({table:'tk_tab',where:{id:14}});//条件删除
    //res=>sql: delete from tk_tab where  id  > 14
    console.log(err14_1,data14_1)
   
  })()

15、聚合函数

 (async ()=>{

    //15.1 count 统计总个数; options.typeField:要统计的字段
        let [err15_1,data15_1] = await db.count({table:"tk_juzihui",field:"id",typeField:"*",group:"classify"})
        //res=>sql:select  id,  count(*) as count  from tk_juzihui  group by classify
        console.info(err15_1,data15_1)

        //15.2 max 查最大值
        let [err15_2,data15_2] = await db.max({table:"tk_juzihui",field:"id",typeField:"id",group:"classify"})
        //res=>sql:select  id,  max(id) as max  from tk_juzihui  group by classify
        console.info(err15_2,data15_2)

        //15.3 min 查最小值
        let [err15_3,data15_3] = await db.min({table:"tk_juzihui",field:"id",typeField:"id",group:"classify"})
        //res=>sql:select  id,  min(id) as min  from tk_juzihui  group by classify
        console.info(err15_3,data15_3)

        //15.4 sum 总和
        let [err15_4,data15_4] = await db.sum({table:"tk_juzihui",field:"id",typeField:"id",group:"classify"})
        //res=>sql:select  id,  sum(id) as sum  from tk_juzihui  group by classify
        console.info(err15_4,data15_4)
        
        //15.5 求平均数
        let [err15_5,data15_5] = await db.avg({table:"tk_juzihui",field:"id",typeField:"id",group:"classify"})
        //res=>sql: select  id,  avg(id) as avg  from tk_juzihui  group by classify
        console.info(err15_5,data15_5)
   
  })()

16、thenAdd(options,where) 查询后结果不存在则添加,were:是查询的条件

 (async ()=>{

    let [err16,data16] =await db.thenAdd({table:"tk_tab",values:{name:"tab-987654",createtime:new Date().getTime()}},{name:"tab-987654"})
    //res=>sql1:select * from tk_tab  where  name = 'tab-987654'
    //     sql2:insert into tk_tab  set name='tab-987654',createtime=1699804955469
    console.info(err16,data16)
   
  })()

17、thenUpdate(options,where) 按where条件查询后不存在则更新

 (async ()=>{

    console.log("----------thenUpdate")
    let [err17,data17] =await db.thenUpdate({table:"tk_tab",values:{name:"视频"},where:{id:2}},{id:["!=",2],name:"视频"})
    //res=>sql:select * from tk_tab  where  id  != 46  and   name = '视频-1' 
    //     sql:update tk_tab  set name='视频-1'  where  id = 2 
    console.info(err17,data17)
   
  })()

18、 pageSelect() 分页查询 ,默认limit:[1,30]第一页,每页30条

 (async ()=>{
   let [err18_1,data18_1] = await db.pageSelect({table:"tk_tab",where:{status:1},limit:[1,15]})
    let [err18_2,data18_2] = await db.pageSelect({
        table:"tk_article as a",
        field:"a.*",
        join:[{join:'left',table:"tk_cate as c",on:"c.id = a.cid"} ],
        order:{[`a.sort`]:"desc",[`a.id`]:"desc",[`a.readcount`]:"desc"},
        limit:[2,2],
        where:[{"a.title|a.remark|c.name":["like",`%js%`]},{"a.status":1},"or"]
    })
    console.info(err18_1,data18_1)
    console.info(err18_2,data18_2)
   
  })()

19、transaction(sqlArr);事务执行

 (async ()=>{
    //  演示帖子与标签的一对多的关系,删除标签,连同中间表也要删除(先删中间表,再删主表)
    let sql19_1 = await db.delete({table:"tk_tab",where:{id:8},build:true});
    let sql19_2 = await db.delete({table:'tk_tab_article',where:{t_id:8},build:true});
    let [err19,data19] = await db.transaction([sql19_2,sql19_1])
    console.log(err19,data19)
   
  })()

20、execsql(sql,data):执行原生sql

 (async ()=>{

    let sql20 = `select * from tk_tab where id=?`;
    let [err20,data20]= await db.execsql(sql20,[1]) 
    console.info(err20,data20)
   
  })()

21、escape():参数转义,其实就是mysql.escape()

 (async ()=>{
     
    console.log(db.escape({id:"12"}));//`id` = '12'
    console.log(db.escape(`"'id=\fsd\sdfd'"`));//   '\"\'id= sdsdfd\'\"'
   
  })()