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

thinkcrud

v1.1.0

Published

一个类似于 ThinkPHP 可协助我们快速组织 SQL 语句,操作数据库的插件

Downloads

24

Readme

thinkcrud

最近在学习 node.js ,也在使用 npm 的 mysql 操作 MySQL 数据库,但是个人觉得在使用 mysql 操作数据的时候,在组织 SQL 语句的时候感觉有点麻烦,可能是本人写习惯了 ThinkPHP ,习惯了将一张表直接转换成一个 Model ,并利用 Model 里的 where()、select()、add()、save() 等方法方便快捷地去操作数据库,于是思索着能不能自己写一个类似的 ThinkPHP CRUD 数据库的 node.js 插件。经过简单查看 ThinkPHP 的源代码后,于是写了这个较为简单,能够协助我们快速组织 SQL 语句的插件。当然现有的功能是十分简单的,后续有时间会继续开发,看看能否有一天像 ThinkPHP 当中操作数据库那样功能完善。

安装

npm install thinkcrud

使用

首先你要先在 node.js 里面引入 mysql ,同 时创建连接池。

var mysql = require('mysql');
var thinkcrud = require('thinkcrud');
var pool = mysql.createPool({
    connectionLimit: 10,
    host: '192.168.1.111',
    user: 'root',
    password: '123456',
    database: 'sports'
});
var order = thinkcrud(pool, 'sp_order'); // sp_order 是数据库对应的表名

这样子就简单地将一个表转换为一个对应的操作对象。 如有需要,可开启 debug 模式, console 会打印每次执行的 SQL 语句。

var order = thinkcrud(pool, 'sp_order').debug(true); // 默认是 false

select() 查询

order.select(function(err, rows, fields){
	// err 为 SQL 执行错误
	// rows 为查询返回结果数组
	// fields 为所查询表字段信息
});

其实际执行的 SQL 语句

SELECT * FROM sp_order;

where() 条件

var map = {
	name: 'Leon',
	class: 12,
	order_no: '20160325094353017859'
};
order.where( map ).select(function(err, rows, fields){

});

其实际执行的 SQL 语句

SELECT * FROM sp_order WHERE ( name = 'Leon' ) AND ( class = 12 ) AND ( order_no = '20160325094353017859' );

若设置 where() 参数中 _logic 属性,则可更改逻辑连接词

var map = {
	name: 'Leon',
	class: 12,
	order_no: '20160325094353017859',
	_logic: 'OR' // 默认为 AND
};
order.where( map ).select(function(err, rows, fields){

});

其实际执行的 SQL 语句

SELECT * FROM sp_order WHERE ( name = 'Leon' ) OR ( class = 12 ) OR ( order_no = '20160325094353017859' );

同时也支持表达式条件

表达式 | 含义 | 协助记忆 :--------------:|:--------------:|:------------------: EQ |等于( = ) |equal NEQ |不等于( <> ) |not equal GT |大于( > ) |greater EGT |大于等于( >= ) |equal or greater LT |小于( < ) |less than ELT |小于等于( <= ) |equal or less than LIKE |模糊查询 | [NOT] BETWEEN |( 不在 )区间查询|
[NOT] IN |( 不在 )IN 查询 |

var map = {
	title: ['like', '%test%'],
    status: ['in', [1, 2, 3] ],
    date: ['between', ['2015-01-01','2016-01-01']],
    age: ['lt', 20],
	_logic: 'OR'
};
order.where( map ).select(function(err, rows, fields){

});

其实际执行的 SQL 语句

SELECT * FROM sp_order WHERE ( title LIKE %课程% ) OR ( status IN (1, 2, 3) ) OR ( date BETWEEN '2015-01-01' AND '2016-01-01' ) OR ( age < 20 );

当然也可以通常设置 where() 参数中的 _string 属性,直接配置条件

var map = {
    age: ['lt', 20],
    _string: 'good_id = 7 AND count > 200',
	_logic: 'OR'
};
order.where( map ).select(function(err, rows, fields){

});

其实际执行的 SQL 语句

SELECT * FROM sp_order WHERE ( age < 20 ) OR ( good_id = 7 AND count > 200 );

field() 字段过滤

可通过执行 field() 来过滤所要查询的字段,默认不执行该方法为查询所有字段 ( SELECT * ) ,同时也可使用 SQL 函数

var map = {
	name: 'Leon',
	class: 12
};
order.field('name, MAX(age)').where( map ).select(function(err, rows, fields){

});

其实际执行的 SQL 语句

SELECT name, MAX(age) FROM sp_order WHERE ( name = 'Leon' ) AND ( class = 12 );

limit()、order()、group()

order.order('name DESC').group('class').limit(2).select(function(err, rows, fields){

});

其实际执行的 SQL 语句

SELECT * FROM sp_order GROUP BY class ORDER BY name DESC LIMIT 2;

在 select() 执行之前,limit()、order()、group() 没有执行顺序要求。 另一种用法

order.order({ name: 'DESC', id: 'ASC' }).group('class').limit(2, 6).select(function(err, rows, fields){

});

其实际执行的 SQL 语句

SELECT * FROM sp_order GROUP BY class ORDER BY name DESC, id ASC LIMIT 2, 6;

insert() 插入

var data = {
	name: 'Leon',
	class: 12,
	order_no: '20160325094353017859'	
};
order.insert(data, function(err, result){
	// err 为 SQL 执行错误
	// result 为执行返回结果,新增数据的主键等
});

其实际执行的 SQL 语句

INSERT INTO sp_order ( name, class, order_no ) VALUES ( 'Leon', 12, '20160325094353017859' );

insert() 这里没有做其它的 SQL 语句拼接,而是直接采用 mysql 原本的 insert 方式执行。 下个版本会增加获取对应执行 SQL 语句的功能,到时候再一起改进这一块。

update() 更新

var data = {
	id: 20, // 主键
	name: 'Leon',
	class: 12,
	order_no: '20160325094353017859'	
};
order.update(data, function(err, result){
	// err 为 SQL 执行错误
	// result 为执行返回结果,包括影响行数等
});

其实际执行的 SQL 语句

UPADTE sp_order SET name = 'Leon', class = 12, order_no = '20160325094353017859' WHERE id = 20;

当使用 update() 更新数据的时候,若传递的参数中带有主键,则优先将主键作为更新数据的条件。 或者也可通过 where()、order()、limit() 来组合更新数据的条件,限制更新数据的条数。

var data = {
	order_no: '20160325094353017859'	
};
order.where({ class: 12 }).order({ id: 'DESC' }).limit(2).update(data, function(err, result){

});

其实际执行的 SQL 语句

UPADTE sp_order SET order_no = '20160325094353017859' WHERE class = 12 ORDER BY id DESC LIMIT 2;

delete() 删除

var data = {
	id: 20 // 主键	
};
order.delete(data, function(err, result){
	// err 为 SQL 执行错误
	// result 为执行返回结果,包括删除行数等
});

其实际执行的 SQL 语句

DELETE FROM sp_order WHERE id = 20;

当使用 delete() 删除数据的时候,若传递参数带有主键的时候,则优先使用主键作为删除数据的条件。 同样也可通过 where()、order()、limit() 来组合删除数据的条件,限制删除数据的条数。

order.where({ class: 12 }).order({ id: 'DESC' }).limit(2).delete(null, function(err, result){
	// delete() 第一个参数传递 null
});

其实际执行的 SQL 语句

DELETE FROM sp_order WHERE class = 12 ORDER BY id DESC LIMIT 2;

为了避免错删数据,如果没有传入任何条件进行删除操作的话,不会执行删除操作,同时还会报错。

order.delete(null, function(err, result){
	// 此时将报错
});

最后

如果有发现什么 Bug 或者问题,欢迎大家 Issues 或者 Pull requests