ForgeTotal.js 5
de

Total.js 5

Query Builder: DB() und NEWDB() mit Ihrem eigenen Datenbank-Driver

Total.js 5 · total5@0.0.19 databasequerybuilder Mit Total.js 5 ausgeführt

DB() baut eine Abfrage, ohne zu wissen, welche Datenbank sie ausführt, und NEWDB() registriert den Treiber, der sie ausführt. total5 selbst hat keinen SQL-Treiber: Der Query Builder sammelt, was du verlangst, in einem options-Objekt und ruft deinen Treiber damit auf, und der Treiber (deiner oder einer aus einem Modul) übersetzt options in SQL, einen NoSQL-Aufruf oder etwas anderes.

  • NEWDB(driver) registriert den Standardtreiber und NEWDB('name', driver) einen benannten. Der Treiber ist function(options, callback): Antworte mit callback(error, response). Eine Tabelle, die als name/table geschrieben ist (DB().find('audit/log')), verwendet den Treiber name und die Tabelle log; ohne Präfix ist der Treiber default.
  • Die Operationen beginnen die Frage: find(table) (Ein Array ist read(table) ein Objekt oder null Wenn es keine gibt, list(table) (Eine Seite von einem Array: response.page, limit und pages Sie werden hinzugefügt, was der Fahrer zurückgibt, so dass der Fahrerin countund insert(table, data)Auch der Bauer hat count, update, remove und querySie arbeiten auf die gleiche Weise (der Fahrer wird options.exec mit diesem Namen).
  • Füllen Sie die Frage mit: where(name, [comparer], value) (= wenn es keinen Vergleich gibt, fields('a,b'), sort(name, [true]) (true für den Abstieg, take(n) und page(page, limit)Andere Modifikationen umfassen id, in, skip, between und search.
  • Schließe mit .callback($) ab: Das Ergebnis geht an die Antwort der Aktion $ oder an eine Funktion (err, response), die du stattdessen übergibst.

Für den vollständigen inländischen Betriebskategorium, Aufregung / Fehlerverhalten und Filterformen, siehe Query-Builder VertragFür SQL CRUD, Commit und Rollback, siehe Query-Builder-SqliteDie Optionen, die der Fahrer empfängt, sind klare Daten. Das Beispiel des Fahrers speichert Aufzeichnungen im Speicher und zeigt das letzte options Objekt erhalten.

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' }]);
});
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);
}