Query Builder: DB() und NEWDB() mit Ihrem eigenen Datenbank-Driver
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 undNEWDB('name', driver)einen benannten. Der Treiber istfunction(options, callback): Antworte mitcallback(error, response). Eine Tabelle, die alsname/tablegeschrieben ist (DB().find('audit/log')), verwendet den Treibernameund die Tabellelog; ohne Präfix ist der Treiberdefault.- Die Operationen beginnen die Frage:
find(table)(Ein Array istread(table)ein Objekt odernullWenn es keine gibt,list(table)(Eine Seite von einem Array:response.page,limitundpagesSie werden hinzugefügt, was der Fahrer zurückgibt, so dass der Fahrerincountundinsert(table, data)Auch der Bauer hatcount,update,removeundquerySie arbeiten auf die gleiche Weise (der Fahrer wirdoptions.execmit diesem Namen). - Füllen Sie die Frage mit:
where(name, [comparer], value)(=wenn es keinen Vergleich gibt,fields('a,b'),sort(name, [true])(truefür den Abstieg,take(n)undpage(page, limit)Andere Modifikationen umfassenid,in,skip,betweenundsearch. - 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.
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' }]);
});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);
}