Операции на QueryBuilder, филтри и договор за шофьор
Тази страница покрива нативния QueryBuilder на total5@0.0.19 (querybuilder.js). DB() връща контролер на опашка. Всяка операция планира извикване на драйвера; добавяйте филтри и callbacks синхронно, преди да се изпълни. NEWDB(name, driver) регистрира връзка. NEWDB(name) я дерегистрира. В тази опашка няма имплицитен механизъм на база данни или транзакция.
Примерният драйвер връща получените опции.За да изпълните операция на базата данни, изпълнете тази операция в драйвера. Къде е скулптурата.
| Операции | Драйверът получава |
|---|---|
find/all(table), read/one(table), list(table) | exec, table; read задава first:true, take:1; list по подразбиране използва take:100, skip:0 |
check(table), count(table) | check задава first:1, take:1; драйверът определя стойността на резултата |
insert/ins(table, data) | payload |
update/modify/mod/upd(table, data, upsert) | payload, upsert; нулев резултат задейства втори insert, когато upsert е разрешен |
remove/rem(table), truncate/clear(table), drop(table) | Съответният exec; деструктивните операции изискват поддръжка от драйвера |
scalar(table, type, key, key2) | scalar:{type,key,key2}; пропуснат key става * |
command(table, name) | command:name |
query(sql, params) или query(connection, sql, params) | Суров текст в query, стойности в params, таблицата е празна; обвързването на SQL параметри е отговорност на драйвера |
Методи на контролера: callback/pipe, promise, done, debug, language, load(connection, options) и exec(options, callback). load копира дефинирано подмножество от сериализирани опции; exec изпраща поддържаните имена на операции. next/free са вътрешни неща на жизнения цикъл. Опашката спира след грешка на драйвера; не отменя по-ранни записи.
NEWDB('contract', function(options, callback) {
if (options.table === 'failure')
return callback(new Error('driver failed'));
if (options.table === 'empty')
return callback(null, []);
if (options.table === 'upsert') {
MAIN.upsert.push(JSON.parse(JSON.stringify(options)));
return callback(null, options.exec === 'update' ? 0 : options.payload);
}
if (options.exec === 'list')
return callback(null, { items: [], count: 12 });
callback(null, options.first ? [options] : options);
});
MAIN.upsert = [];exports.install = function() {
ROUTE('GET /contract/', contract);
};
async function contract($) {
try {
var out = {};
var methods = ['find', 'all', 'read', 'one', 'list', 'check', 'count', 'insert', 'ins', 'update', 'modify', 'mod', 'upd', 'remove', 'rem', 'truncate', 'clear', 'drop'];
out.operations = {};
for (var method of methods)
out.operations[method] = await DB()[method]('contract/items', { name: 'Ann' }).promise();
out.scalar = await DB().scalar('contract/items', 'sum', 'amount', 'group').promise();
out.command = await DB().command('contract/items', 'vacuum').promise();
out.raw = await DB().query('contract', 'SELECT ?', [7]).promise();
out.filters = await DB().find('contract/items').id([1, 2]).userid({ id: 'u1' }).equal({ active: true }).where('age', '!=', 0).in('team', [{ id: 'a' }], 'id').notin('team', 'b').between('age', 18, 65).or(function(q) { q.where('role', 'a').where('role', 'b'); }).array('tags', ['x']).month('created', 1).day('created', 2).year('created', '>=', 2020).hour('created', 3).minute('created', 4).search('name', 'ann', 'beg').contains('email').empty('deleted').query('trusted_fragment').join('team', 'teams', 'left', 'a.id', 'b.id').permit('permissions', 'RW', ['team'], 'u1', false).promise();
out.options = await DB().find('contract/items').fields('id, name').returning('id, name').sort('name', true).gridsort('id_asc').limit(5).skip(2).primarykey('uid').schema('public').language({ language: 'es' }, '_').debug().promise();
out.page = await DB().list('contract/items').paginate('2', '500', 10).promise();
out.grid = await DB().find('contract/items').autoquery({ fields: 'id,password', sort: 'password_desc,name_desc', page: '2', limit: '500', age: '>18' }, 'id:String,name:String,age:Number', 'id_asc', 10).promise();
out.gridfields = await DB().find('contract/items').gridfields('id', 'id,name').promise();
var queue = DB();
queue.read('contract/items').set('one');
queue.count('contract/items').set('count');
queue.find('contract/items').nobind();
out.queue = await queue.promise();
var hooks = [];
await DB().read('contract/empty').data(function(v) { hooks.push(v === null ? 'null' : 'value'); }).promise();
try { await DB().read('contract/empty').error('missing').fail(function() { hooks.push('fail'); }).promise(); } catch (e) { out.missing = String(e); }
try { await DB().find('contract/failure').promise(); } catch (e) { out.failure = String(e); }
out.hooks = hooks;
out.upsert = await DB().update('contract/upsert', { name: 'new' }, true).where('id', 7).insert(function(payload, role) { payload.role = role; }, 'member').promise();
out.upsertCalls = MAIN.upsert;
out.load = await DB().load('contract', { table: 'items', exec: 'find', take: 2, filter: [] }).promise();
$.json(out);
} catch (e) { $.invalid(e); }
}