# Οι λειτουργίες του QueryBuilder, οι φίλτρα και η σύμβαση οδήγησης

> Ελέγξτε τις επιλογές DB και NEWDB, τα αποτελέσματα που έχουν γίνει, τα σφάλματα και οι μορφές φίλτρου χωρίς να συγχέετε έναν κατασκευαστή με έναν οδηγό βάσης δεδομένων.

Framework: total5
Product: Total.js 5 (total5@0.0.19)
Language: el
Content-SHA256: 24540012c24b97f96b54d3bc6592bbe1032554c568d5af4d26b073fc92372208
Snapshot: c0700e321579725c5cf4f5ace1ad7d2866d1b4f93c24a63c0b41b6b7998e976c
Sources: total5-installed@total5@0.0.19
Review: not-recorded

Αυτή η σελίδα καλύπτει το εγγενές QueryBuilder του `total5@0.0.19` (`querybuilder.js`). Το `DB()` επιστρέφει έναν ελεγκτή ουράς. Κάθε λειτουργία προγραμματίζει μια κλήση προς τον driver· προσθέστε φίλτρα και callbacks σύγχρονα πριν εκτελεστεί. Το `NEWDB(name, driver)` καταχωρίζει μια σύνδεση. Το `NEWDB(name)` την αποκαταχωρίζει. Δεν υπάρχει υπονοούμενη μηχανή βάσης δεδομένων ή συναλλαγή σε αυτή την ουρά.

Για να εκτελέσετε μια λειτουργία βάσης δεδομένων, εφαρμόστε αυτή τη λειτουργία στον οδηγό. [Ετικέτες Sqlite](/en/total5/query-builder-sqlite/).

| Λειτουργίες | Ο driver λαμβάνει |
|---|---|
| `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`· ο driver ορίζει την τιμή του αποτελέσματος |
| `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`· οι καταστροφικές λειτουργίες χρειάζονται υποστήριξη από τον driver |
| `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 είναι ευθύνη του driver |

| Μέθοδοι ερωτήματος | Επιλογές / συμπεριφορά |
|---|---|
| `where(name, [comparer], value)`, `equal(object)`, `id(value)`, `userid(value)` | Συντόμευση ισότητας· το `==` γίνεται `=`, το `!=` γίνεται `<>`· τα ID σε πίνακα χρησιμοποιούν `in` |
| `in/notin(name, values, [idField])`, `between(name,a,b)`, `or(fn)` | Φιλτράρουν εγγραφές· το `or` ομαδοποιεί τις εγγραφές που προστέθηκαν μέσα στο `fn(builder)` |
| `array(name,[comparer],value)` | Προεπιλεγμένος συγκριτής `&&`· η ερμηνεία ανήκει στον driver |
| `month/day/year/hour/minute(name,[comparer],value)` | Φίλτρα κατά τμήμα ημερομηνίας· προεπιλεγμένος συγκριτής `=` |
| `search(name,value,[where])`, `contains(name)`, `empty(name)` | Φιλτράρουν εγγραφές· η σημασιολογία ταύτισης ανήκει στον driver |
| `query(fragment)`, `join(name,table,type,a,b)`, `permit(name,type,values,userid,required)` | Φίλτρα ειδικά για τον driver· τα ακατέργαστα τμήματα πρέπει να προέρχονται από αξιόπιστο κώδικα εφαρμογής |
| `fields(csv)`, `returning(csv)` | Πίνακες περικομμένων ονομάτων πεδίων, όχι escaping SQL ή εξουσιοδότηση |
| `sort(name, descending)`, `gridsort(csv,[localized])` | Συμβολοσειρές ταξινόμησης· το `true` ή το `desc` επιλέγουν φθίνουσα |
| `take/limit(n)`, `skip(n)`, `page(page,limit)`, `paginate(page,limit,max)` | Μετατοπίσεις/όρια· το `paginate` περιορίζει το όριο, το `page` όχι |
| `first()`, `primarykey(name)`, `schema(name)`, `language(value,prefix,skip)`, `debug()` | Μεταδεδομένα για τον driver· το `first` ξεπακετάρει επίσης αποτέλεσμα πίνακα |
| `gridfilter(name,query,type,[key])`, `autoquery(query,schema,sort,max)` | Μετατρέπουν τις παραμέτρους ερωτήματος του grid σε επιλογές. Το `autoquery` περιορίζει τα ζητούμενα πεδία και τα κλειδιά ταξινόμησης στο δηλωμένο σχήμα του |
| `gridfields(fields,allowed)` | Χρησιμοποιήστε το `fields()` με τη δική σας λίστα επιδόσεων: είναι ο δοκιμασμένος τρόπος για να επιλέξετε τις στήλες |
| `callback/pipe(fn)`, `promise()`, `done($,fn,param)` | Ολοκλήρωση· τα promises απορρίπτονται σε σφάλμα του driver |
| `data(fn)`, `fail(fn)`, `error/err(message,reverse)` | Hooks επιτυχίας/αποτυχίας· το `error()` απορρίπτει κενά αποτελέσματα, το `reverse:true` απορρίπτει αληθή αποτελέσματα (συμπεριλαμβανομένου κενού πίνακα) |
| `set(name)`, `nobind()` | Ονομάζουν το αποτέλεσμα στην ουρά ή δεν αντικαθιστούν την έξοδο της ουράς |
| `insert(fn,param)` σε έναν update builder | Τροποποιεί το payload πριν από το εφεδρικό insert ενός upsert |
| `audit($,message,type)` | Καλεί τα `variables()` και `audit()` του παρεχόμενου context μετά από επιτυχή απόκριση του driver |

Μέθοδοι ελεγκτή: `callback/pipe`, `promise`, `done`, `debug`, `language`, `load(connection, options)` και `exec(options, callback)`. Το `load` αντιγράφει ένα καθορισμένο υποσύνολο σειριοποιημένων επιλογών· το `exec` αποστέλλει τα υποστηριζόμενα ονόματα λειτουργιών. Τα `next/free` είναι εσωτερικά του κύκλου ζωής. Μια ουρά σταματά μετά από σφάλμα του driver· δεν αναιρεί προηγούμενες εγγραφές.

```js 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 = [];
```

```js 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); }
}
```
