文档
中文文档 https://www.songxingguo.com/2018/06/30/knex.js-query/ (这个中文文档已经不存在了)
英文文档 https://knexjs.org/
knex.js
Knex的主要目标环境是Node.js,需要安装该knex库,然后安装适当的数据库库:pg适用于PostgreSQL和Amazon Redshift,mysql适用于MySQL或MariaDB,sqlite3适用于SQLite3或mssql适用于MSSQL。
初始化数据库
let db = Knex({
client: 'mysql',
connection: {
host : '127.0.0.1',
user : 'your_database_user',
password : 'your_database_password',
database : 'myapp_test'
}
});
global._db = db; //设为全局
简单的语句中文文档里就可以查到
讲一下多表查询
连接构建器可用于指定表之间的连接,第一个参数是连接表,后三个参数分别是第一个连接列,连接操作符和第二个连接列。
例:
knex('users')
.join('contacts', 'users.id', '=', 'contacts.user_id')
.select('users.id', 'contacts.phone')
输出:
select `users`.`id`, `contacts`.`phone` from `users` inner join `contacts` on `users`.`id` = `contacts`.`user_id`
使用join时所有字段前都必须加上表名
async getTask(params){
let result = await global._db('table1')
.where('table1.user',params.user)
.join('table2','table1.id','=','table2.id')
.select('table1.name','table1.id','table2.id');
return result;
}
这里讲一下复杂语句的实现,可以在英文文档中找
原始sql语句为
select count(*) as user_count, status from 'users' where 1 or status <> 1 group by 'status'
let sql = [
`count(*) as user_count, status from 'users' where 1 or status <> 1 group by 'status'`
];
let result = await _db.select(_db.row(sql.join(',')));
let a = result.toString(); //返回基于绑定等填充正确值的查询字符串数组。用于调试,但不应用于创建查询以针对DB运行它们。
let b = result.clone();
return {
result: result,
a: a,
b: b
};
或者用文档提供的这种方法