ForgeTotal.js 5
hu

Total.js 5

QueryBuilder műveletek, szűrők és a járművezetői szerződések

Total.js 5 · total5@0.0.19 total5reference Total.js 5-tel lefuttatva

Ez az oldal a total5@0.0.19 natív QueryBuilderét (querybuilder.js) tárgyalja. A DB() egy sorvezérlőt ad vissza. Minden művelet egy driverhívást ütemez; a szűrőket és callbackeket a végrehajtás előtt szinkron módon fűzd hozzá. A NEWDB(name, driver) kapcsolatot regisztrál. A NEWDB(name) megszünteti a regisztrációt. Ebben a sorban nincs implicit adatbázismotor vagy tranzakció.

A példa vezérlő visszatér a kapott opciókat.Az adatbázis műveletének végrehajtásához hajtsa végre azt a műveletet a vezérlésen. Keresés-építészek.

MűveletekA driver megkapja
find/all(table), read/one(table), list(table)exec, table; a read beállítja a first:true, take:1 értéket; a list alapértéke take:100, skip:0
check(table), count(table)A check beállítja a first:1, take:1 értéket; az eredményértéket a driver határozza meg
insert/ins(table, data)payload
update/modify/mod/upd(table, data, upsert)payload, upsert; nulla eredmény második insertet vált ki, ha az upsert engedélyezett
remove/rem(table), truncate/clear(table), drop(table)A megfelelő exec; a romboló műveletekhez driver-támogatás kell
scalar(table, type, key, key2)scalar:{type,key,key2}; az elhagyott key értéke * lesz
command(table, name)command:name
query(sql, params) vagy query(connection, sql, params)Nyers szöveg a query mezőben, értékek a params mezőben, a tábla üres; az SQL-kötés a driver felelőssége
Lekérdezési metódusokOpciók / viselkedés
where(name, [comparer], value), equal(object), id(value), userid(value)Egyenlőségi rövidítés; a == = lesz, a != lesz; a tömb azonosítók in-t használnak
in/notin(name, values, [idField]), between(name,a,b), or(fn)Rekordokat szűrnek; az or az fn(builder) belsejében hozzáadott rekordokat csoportosítja
array(name,[comparer],value)Alapértelmezett összehasonlító &&; az értelmezés a driver dolga
month/day/year/hour/minute(name,[comparer],value)Dátumrész szerinti szűrők; alapértelmezett összehasonlító =
search(name,value,[where]), contains(name), empty(name)Rekordokat szűrnek; az egyezés szemantikája a driver dolga
query(fragment), join(name,table,type,a,b), permit(name,type,values,userid,required)Driverspecifikus szűrők; a nyers töredékeknek megbízható alkalmazáskódból kell származniuk
fields(csv), returning(csv)Megtisztított mezőnevek tömbjei, nem SQL escape vagy jogosultságkezelés
sort(name, descending), gridsort(csv,[localized])Rendezési sztringek; a true vagy a desc csökkenőt választ
take/limit(n), skip(n), page(page,limit), paginate(page,limit,max)Eltolások/limitek; a paginate korlátozza a limitet, a page nem
first(), primarykey(name), schema(name), language(value,prefix,skip), debug()Metaadatok a drivernek; a first a tömb eredményt is kicsomagolja
gridfilter(name,query,type,[key]), autoquery(query,schema,sort,max)A grid lekérdezési paramétereit opciókká alakítják. Az autoquery a kért mezőket és rendezési kulcsokat a deklarált sémára korlátozza
gridfields(fields,allowed)Használja a fields()-t saját engedélyezési listájával: ez a tesztelt módja annak, hogy kiválassza a oszlopokat
callback/pipe(fn), promise(), done($,fn,param)Befejezés; a promise-ok elutasításra kerülnek driverhiba esetén
data(fn), fail(fn), error/err(message,reverse)Siker/hiba hookok; az error() elutasítja az üres eredményeket, a reverse:true az igaz értékű eredményeket (az üres tömböt is)
set(name), nobind()Elnevezik a sorban álló eredményt, vagy nem cserélik le a sor kimenetét
insert(fn,param) egy update builderenMódosítja a payloadot az upsert tartalék insertje előtt
audit($,message,type)Sikeres driverválasz után meghívja a kapott kontextus variables() és audit() függvényét

Vezérlő metódusok: callback/pipe, promise, done, debug, language, load(connection, options) és exec(options, callback). A load a szerializált opciók egy meghatározott részhalmazát másolja; az exec a támogatott műveletneveket osztja ki. A next/free az életciklus belső elemei. A sor driverhiba után leáll; a korábbi írásokat nem vonja vissza.

definitions/contract.js
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 = [];
controllers/contract.js
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); }
}