linq2mysql v2.0.1
介绍
在Nodejs中,使用Linq语法查询Mysql数据库。
入门
安装
npm install --save linq2mysql使用
var linq = require('linq2mysql');
var db = new linq("mysql://root@127.0.0.1/linq?connectionLimit=10&charset=utf8mb4");具体数据库连接参数请参考mysql。
查询
where
查询条件使用where方法添加,可以级联多个where条件,多个where方法调用生成的SQL语句用AND进行连接。
where参数可以是lambda表达式,也可以是一个对象。对象各字段条件用AND语句连接,单个key转换为=。
关于where的更多内容请参考linq2sql。
基础查询
await db.table("users").where(p=>p.age==0).toArray()带变量的查询
await db.table("users").where(p=>p.age==age,{age:0}).toArray()只返回第一个数据
await db.table("users").where(p=>p.age==0).first()统计
await db.table("users").where(p=>p.age==0).count()分页
await db.table("users").where(p=>p.age==0).skip(1).take(1).toArray()返回指定字段
await db.table("users").where(p=>p.age==0).select(p=>{p.age,p.id}).toArray()查询大量数据
当数据量特别大的时候,如果直接返回大量数据,将会造成溢出。
await db.table("users").where(p=>p.age==0).each(function(row){});
await db.table("users").where(p=>p.age==0).each(async function(row){});
await db.table("users").where(p=>p.age==0).each(10,function(row){});each方法共有两个参数:
- 第一个参数:指定并发处理的数量,该参数可以省略。
- 第二个参数:指定处理的函数,当函数返回
false取消后续的执行。
each方法返回值为已处理的总行数。
返回值受javascript数据类型大小限制
排序
排序共有四个方法:
- orderBy - 升序
- thenBy - 升序
- orderByDescending - 降序
- thenByDescending - 降序
连接
支持左连接、右连接、内连接
- leftJoin
- rightJoin
- innerJoin
连接方法返回的对象支持on方法,用于添加连接条件;on方法返回的对象不再具有on方法。
await db.table('users').leftJoin('scores').on((p,q)=>p.id==q.userid).where(p=>p.age>=0).select((p,q)=>{
p.id,
p.username,
p.password,
p.age,
q.score
}).toArray();在连接查询中,有些时候只需要返回一个表的所有字段,可以使用*来指定,多个表的字段输出,使用,分隔。
await db.table('users').leftJoin('scores').on((p,q)=>p.id==q.userid).where(p=>p["*"]
}).toArray();Insert
await db.table('users').insert({
username:'admin',
password:'admin888',
age:39
})
await db.table('users').insert({
username:'admin',
password:'admin888',
age:39
},{
username:'admin',
password:'chagepwd',
age:40
})
await db.table('users').insert([{
username:'admin',
password:'admin888',
age:39
},{
username:'admin',
password:'admin888',
age:39
}])insert 方法参数可以是一个对象或数组。
当包含第二个参数时,第一个参数只能是一个对象,此时,只能插入一个对象。当第一个参入写入到数据库中发生主键冲突时,使用第二个参数更新冲突的数据库行。 当第二个参数是一个表达式时,第三个参数为表达式的常量。
Update
await db.table("users").where(p=>p.age==0).update({age:10});
await db.table("scores").where(p=>p.userid==1).update(p=>{
p.score=p.score+1
});在
update语句中,不支持`p.x++这种语句。
Delete
await db.table("users").where(p=>p.age==0).delete()Count
var count=await db.table("scores").where(p=>p.userid==1).count();Exists
判断指定的查询条件是否在数据库中有数据。
var exists=await db.table("scores").where(p=>p.userid==1).exists();SqlTable
在查询的时候,可以使用SQL语句做为一个虚拟表。
var items=await db.table(new linq.SqlTable('select * from scores where score>10')).where(p=>p.userid==1).toArray();更新或插入对象
已废弃,请直接使用
insert的replacer参数。
在某些时候,我们需要判断指定查询条件的在数据库中是否有值,在有的时候调用更新语句,没有的时候调用写入语句。
await db.table("scores").where({ id: 1 }).insertOrUpdate({ userid: 1, score: 50 });
await db.table("scores").where({ id: 1 }).insertOrUpdate({ userid: 1, score: 50 }, function (e, m) {
return {
entity: { userid: 1, score: 99 },
mode: "INSERT"
}
})insertOrUpdate方法有两入参数,insertOrUpdate(entity,handler)
- entity 要插入或更新的对象
- handler 在更新或插入对象前,对对象数据进行处理,
handler有两个参数handler(entity,mode),entity是insertOrUpdate方法传入的数据对象,mode是将进行的操作UPDATE或INSERT。返回值是一个对象,有两个属性:entity是要插入或更新的对象,mode是将要进行的操作,可选值同上。
db.table
该方法返回一个Linq实例,只有在调用count,insert,delete,update,first,toArray,exists,insertOrUpdate,才会返回数据,其它方法均返回对象本身。
参数
- table - 可以是表名称,SqlTable对象和db.table实例。
- database - 指定库名称,默认为链接字符串中指定的库名。
db.execute
执行sql语句,并返回结果。
await db.execute(sql,[values]);db.each
执行sql语句,并通过流模式处理返回的数据。
await db.each(sql,[values],[max],callback);事务
MyISAM引擎不支持事务操作。
开始一个事务
let trans = await db.beginTransaction();事务开始后,你可以像db一样进行数据库操作
提交事务
await trans.commit();回滚事务
await trans.rollback();无论是提交还是回滚事务,当前事务的连接都将释放回链接池中。
其它
update,insert,delete返回参数请参考mysql。
在连接参数中指定supportBigNumbers而没有指定bigNumberStrings时,bigint类型的数据将被转换为Javascript中的BigInt类型。
1 year ago
2 years ago
2 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
5 years ago
6 years ago
6 years ago
6 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago