febs db库用于连接数据库,目前仅支持mysql
febs-db是在citong-db@1.5.3基础上进行开发, citong-db库已停止更新
Install
Use npm to install:
npm install febs-db --save
febs-db是一个orm库, 3个主要的类为:
database
: 代表一个数据库; 可以用于创建新的数据库连接对象database-connection
进行事务等操作.
table
: 代表一个数据库表; 针对此的操作在这个对象中完成
database_connection
: 表示一个连接对象, 在执行事务操作时, 需要使用database来向连接池中获取一个连接来进行.
Exception
在错误发生时会抛出exception
类型的异常
事务处理中发生异常将自动rollback.
定义了常用的错误代码.
exception.DB_ERROR_SQL
exception.DB_ERROR_CONNECT
exception.DB_ERROR
异常类如下
exception(msg, code, filename, line)
例子:
var exception = require('.').exception;
try {
yield db.queryById(...);
} catch (e) {
if (e instanceof exception) {
} else {
throw e;
}
}
Define-table
操作一个数据表之前, 需要先对表结构进行定义, 与数据不匹配的定义在执行数据操作时会报错. 数据列可以仅列出需要操作的列.
var table = require('.').table;
class TableDemo extends table {
constructor(db) {
super(
db,
'User',
'ID',
{
ID: {type: 'integer', size: 8, key: true},
Name: {type: 'text', size:10},
NumberCol:{type: 'number', size: 4},
IntCol: {type: 'integer', size: 4},
IntCol: {type: 'integer', size: 8},
BoolCol: {type: 'boolean'}
}
);
}
}
example:
var database = require('febs-db').database;
var db = new database({});
var tableDemo = new TableDemo(db);
combined primary key
var table = require('.').table;
class TableDemo extends table {
constructor(dbclient) {
super(
dbclient,
'Admin',
['ID', 'IntCol'],
{
ID: {type: 'integer', size: 8, key: true},
Name: {type: 'text', size:10},
NumberCol:{type: 'number', size: 4},
IntCol: {type: 'integer', size: 4},
IntCol: {type: 'integer', size: 8},
BoolCol: {type: 'boolean'}
}
);
}
}
Connect-db
mysql: see mysql pool-options.
var database = require('febs-db').database;
var opt = {
waitForConnections: true,
connectTimeout : 5000,
acquireTimeout : 5000,
queueLimit : 20,
connectionLimit : 10,
supportBigNumbers : true,
bigNumberStrings : false,
host : '',
port : 3306,
user : '',
password : '',
database : '',
queryTimeout : 5000,
};
var db = new database('mysql', opt);
var table = new TableDemo(db);
Manipulate-db
数据操作方法都存在同步方式和异步方式, 例如: table.isExist()
和 table.isExistSync()
所有的同步方式方法都是在末尾加上Sync
exist
let r;
r = yield table.isExist(1);
r = yield table.isExist({ID:1,Name:'xxx'});
r = yield table.isExistWhere("id=43");
r = yield table.isExistSync(1, (err, r)=>{});
r = yield table.isExistWhereSync("id=43", (err, r)=>{});
query
let r;
r = yield table.queryById(1);
r = yield table.queryById(1, ['ID','Name']);
r = yield table.queryById({ID:1,IntCol:1}, ['ID','Name']);
r = yield table.queryTop("id = 43");
r = yield table.queryTop("id = 43", ['ID','Name']);
let where = '';
where += table.make_condition('id', 43);
where += 'AND';
where += table.make_condition_like('name', '%dfdfd%');
r = yield table.queryTop(where);
r = yield table.queryWhere(where, [0, 100], {ID:true});
r = yield table.queryWhere(where, ['ID', 'Name']);
r = yield table.queryWhere(where, [0, 100], ['ID', 'Name']);
r = yield table.queryWhere(where, {ID:true}, ['ID', 'Name']);
r = yield table.queryWhere(where, ['COUNT(ID) as x']);
query-lock-row
锁行方式查询, 只能在事务中使用此方式. 在事务结束或update之后自动解锁.
queryLockRow
方法的参数与queryById
方法相同
var conn = yield db.getConnection();
if (conn)
{
return yield conn.transaction(function*(){
let r;
r = yield table.queryLockRow(1, conn);
r = yield table.queryLockRow(1, ['col1','col2'], conn);
return false;
return true;
});
}
count
let r;
let where = table.make_condition('id', 43);
r = yield table.count(where);
add
var r = yield table.add({ID:8,...});
update
更新方法需传入一个对象, 其中必须附带主键
, 执行后将更新其他在参数中的其他数据.
var mod = {
ID: 1,
name: "name",
intCol: table.make_update_inc(1),
intCol2:table.make_origin_sql('`intCol2`+1')
};
var r = yield table.update(mod);
remove
var r = yield table.remove(where);
transaction
- 执行事务需要一个独立的连接对象
datdatabase_connection
, 事务完成后连接对象将重新被插入到连接池中. - 事务处理函数中, 所有的事务数据库操作方法都必须在最后带上这个
连接对象
- 事务处理函数中, 返回
false
将rollback
, 返回true
将commit
- 若发生异常, 事务将自动
rollback
. - *事务嵌套调用未处理, 将在下一版本添加
var conn = yield db.getConnection();
if (conn)
{
return yield conn.transaction(function*(){
console.log((yield table.add(mod, conn)));
mod.id = 1;
mod.name = 'a1';
console.log((yield table.update(mod, conn)));
return false;
return true;
});
}
database
构造
constructor(dbtype, opt)
- dbtype: 数据库类型, 目前仅能为
'mysql'
- opt: 连接参数
mysql: see mysql pool-options.
var opt = {
waitForConnections: true,
connectTimeout : 5000,
acquireTimeout : 5000,
queueLimit : 20,
connectionLimit : 10,
supportBigNumbers : true,
bigNumberStrings : false,
host : '',
port : 3306,
user : '',
password : '',
database : '',
queryTimeout : 5000,
};
获取连接
从连接池中获取一个空闲的连接用于事务处理.
*getConnection()
table
所有的数据库查询方法都存在相应的同步调用方式, 如: queryWhereSync();
构造查询条件相关方法
table-constructor
*constructor(db, tablename, idKeyName, model)
model
的定义格式如下:
{
colName: {type
: 'integer', size
: 8, key
: true}, // the auto-incrementing
...
}
-
colName
: 表示列名称
-
type
: 表示列类型
类型 | 说明 | size |
---|
'integer' | 整型 | 指明字节长度 |
'text' | 字符串 | 指明字符长度 |
'number' | 浮点型 | 指明字节长度 |
'boolean' | 布尔型 | 无意义 |
-
size
: 字段长度(字节长度), 例如: bigint 长度为8, int长度为4.
-
key
: 是否是自增键; (同一个表只能有一个自增键, 当指定多个自增键时, 只认为最后一个为自增)
table-isExist
*isExist( id )
isExistSync( id, cb )
table-isExistWhere
*isExistWhere( where )
isExistWhereSync()
table-count
*count()
countSync()
table-add
*add( item )
addSync( item, cb )
table-remove
*remove( where )
removeSync( where, cb )
table-update
*update( item )
updateSync( item )
table-queryById
*queryById( id )
queryByIdSync( id )
table-queryLockRow
*queryLockRow( id )
queryLockRowSync( id )
table-queryTop
*queryTop( where )
queryTopSync( where )
table-queryWhere
*queryWhere( where )
queryWhereSync( where )
table-get_conn
get_conn(arguments)
table-escape
escape( v )
table-make_condition
make_condition( key, value )
table-make_condition_not_equal
make_condition_not_equal( key, value )
table-make_condition_more
make_condition_more( key, value )
table-make_condition_more_equal
make_condition_more_equal( key, value )
table-make_condition_less_equal
make_condition_less_equal( key, value )
table-make_condition_less
make_condition_less( key, value )
table-make_condition_like
make_condition_like( key, value )
table-make_update_inc
make_update_inc( n );
yield table.update({ ID:1, value: table.make_update_inc(1) });
table-make_origin_sql
make_origin_sql( v )