QueryBuilder operaciones, filtros y contratos de conductor
Esta página cubre el QueryBuilder nativo de total5@0.0.19 (querybuilder.js). DB() devuelve un controlador de cola. Cada operación programa una llamada al driver; añade filtros y callbacks de forma síncrona antes de que se ejecute. NEWDB(name, driver) registra una conexión. NEWDB(name) la elimina. No hay motor de base de datos ni transacción implícitos en esta cola.
Para ejecutar una operación de base de datos, implementar esa operación en el driver. Query-constructor-sqlite.
| Operaciones | El driver recibe |
|---|---|
find/all(table), read/one(table), list(table) | exec, table; read establece first:true, take:1; list por defecto usa take:100, skip:0 |
check(table), count(table) | check establece first:1, take:1; el driver define el valor del resultado |
insert/ins(table, data) | payload |
update/modify/mod/upd(table, data, upsert) | payload, upsert; un resultado cero provoca un segundo insert cuando upsert está activado |
remove/rem(table), truncate/clear(table), drop(table) | El exec correspondiente; las operaciones destructivas necesitan soporte del driver |
scalar(table, type, key, key2) | scalar:{type,key,key2}; un key omitido se convierte en * |
command(table, name) | command:name |
query(sql, params) o query(connection, sql, params) | Texto en bruto en query, valores en params, la tabla está vacía; el enlace de parámetros SQL es responsabilidad del driver |
Métodos del controlador: callback/pipe, promise, done, debug, language, load(connection, options) y exec(options, callback). load copia un subconjunto definido de opciones serializadas; exec despacha los nombres de operación admitidos. next/free son detalles internos del ciclo de vida. Una cola se detiene tras un error del driver; no deshace escrituras anteriores.
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); }
}