# Δημιουργός αναζήτησης: DB() και NEWDB() με τον δικό σας οδηγό δεδομένων

> Δημιουργήστε ερωτήσεις με το DB().find().where().sort() και αφήστε έναν οδηγό που είναι εγγεγραμμένος με το NEWDB() να τις εκτελεί, ενώ ένας εγγεγεγραμμισμένος οδηγός εφαρμόζει λειτουργίες βάσης δεδομένων.

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

Το `DB()` φτιάχνει ένα ερώτημα χωρίς να γνωρίζει ποια βάση δεδομένων θα το εκτελέσει και το `NEWDB()` καταχωρίζει τον **driver** που το εκτελεί. Το ίδιο το `total5` δεν έχει driver SQL: ο query builder συγκεντρώνει όσα ζητάτε σε ένα αντικείμενο `options` και καλεί τον driver σας με αυτό και ο driver (δικός σας ή ένας που έρχεται σε ενότητα) μεταφράζει το `options` σε SQL, σε κλήση NoSQL ή σε οτιδήποτε άλλο.

- Το `NEWDB(driver)` καταχωρίζει τον προεπιλεγμένο driver και το `NEWDB('name', driver)` έναν με όνομα. Ο driver είναι `function(options, callback)`: απαντήστε με `callback(error, response)`. Ένας πίνακας γραμμένος ως `name/table` (`DB().find('audit/log')`) χρησιμοποιεί τον driver `name` και τον πίνακα `log`· χωρίς πρόθεμα ο driver είναι ο `default`.
- Οι εργασίες ξεκινούν με το ερώτημα: `find(table)` (αυτός είναι ο τρόπος `read(table)` Ένα αντικείμενο, ή `null` Όταν δεν υπάρχει, `list(table)` (Μια σελίδα από μια συλλογή: `response.page`, `limit` και `pages` προστίθεται σε αυτό που επιστρέφει ο οδηγός, έτσι ο οδηγος θα πρέπει να καθορίσει `count`) και `insert(table, data)`Ο κατασκευαστής έχει επίσης `count`, `update`, `remove` και `query`Ο οδηγός λειτουργεί με τον ίδιο τρόπο (ο οδηγός `options.exec` Με το όνομα αυτό).
- Επεξεργαστείτε το ερώτημα με: `where(name, [comparer], value)` (`=` Όταν δεν υπάρχει σύγκριση, `fields('a,b')`, `sort(name, [true])` (`true` για να κατεβαίνει, `take(n)` και `page(page, limit)`Άλλες τροποποιήσεις περιλαμβάνουν `id`, `in`, `skip`, `between` και `search`.
- Ολοκληρώστε με `.callback($)`: το αποτέλεσμα πηγαίνει στην απάντηση της ενέργειας `$` ή σε μια συνάρτηση `(err, response)` που περνάτε αντί γι' αυτό.

Για το πλήρες εγχώριο κατάλογο λειτουργίας, συμπεριφορά σφάλματος / σφάλμα και μορφές φίλτρου, δείτε [Σύμβαση κατασκευαστή](/en/total5/query-builder-contract/)Για το SQL CRUD, Command και Rollback, δείτε [Ετικέτες Sqlite](/en/total5/query-builder-sqlite/)Οι επιλογές που λαμβάνει ο οδηγός είναι σαφή δεδομένα. το παράδειγμα του οδηγού αποθηκεύει αρχεία στη μνήμη και εκθέτει το τελευταίο αντικείμενο `options` που έχει λάβει.

```js definitions/db.js
const users = [
	{ id: 1, name: 'Ann', age: 31 },
	{ id: 2, name: 'Bob', age: 17 },
	{ id: 3, name: 'Cy', age: 45 }
];

F.seen = [];

// The default driver: it understands only "age >= value" and "id = value", which is all this example asks
NEWDB(function(options, callback) {

	F.seen.push(JSON.parse(JSON.stringify(options)));

	let rows = users.slice();

	for (let f of options.filter) {
		if (f.type === 'where' && f.name === 'age' && f.comparer === '>=')
			rows = rows.filter(n => n.age >= f.value);
		else if (f.type === 'where' && f.name === 'id')
			rows = rows.filter(n => n.id === f.value);
	}

	switch (options.exec) {
		case 'find':
		case 'read':
			if (options.sort && options.sort[0] === 'name_desc')
				rows.sort((a, b) => a.name < b.name ? 1 : -1);
			if (options.take)
				rows = rows.slice(0, options.take);
			return callback(null, rows);
		case 'list':
			rows.count = rows.length;
			return callback(null, rows);
		case 'insert':
			users.push(Object.assign({ id: users.length + 1 }, options.payload));
			return callback(null, users[users.length - 1]);
		default:
			return callback('The driver does not know ' + options.exec);
	}
});

// A second driver, used by the tables that start with "audit/"
NEWDB('audit', function(options, callback) {
	F.seen.push({ driver: 'audit', table: options.table });
	callback(null, [{ event: 'login' }]);
});
```

```js controllers/users.js
exports.install = function() {
	ROUTE('GET /adults/', adults);
	ROUTE('GET /user/{id}/', user);
	ROUTE('POST /users/', create);
	ROUTE('GET /page/', page);
	ROUTE('GET /audit/', audit);
	ROUTE('GET /seen/', seen);
};

function adults($) {
	DB().find('users').where('age', '>=', 18).fields('id,name').sort('name', true).take(5).callback($);
}

function user($) {
	DB().read('users').where('id', +$.params.id).callback($);
}

function create($) {
	DB().insert('users', { name: $.body.name, age: $.body.age }).callback($);
}

function page($) {
	DB().list('users').page(1, 2).callback(function(err, response) {
		$.json({ err: err, count: response.count, page: response.page, limit: response.limit, pages: response.pages });
	});
}

function audit($) {
	DB().find('audit/log').callback($);
}

function seen($) {
	$.json(F.seen);
}
```
