Allow custom table name in mysql

This commit is contained in:
Anatoliy Chakkaev 2012-03-07 11:29:08 +04:00
parent 028375b16e
commit d3231e7484
2 changed files with 18 additions and 12 deletions

View File

@ -29,6 +29,7 @@ function MySQL(client) {
} }
MySQL.prototype.define = function (descr) { MySQL.prototype.define = function (descr) {
if (!descr.settings) descr.settings = {};
this._models[descr.model.modelName] = descr; this._models[descr.model.modelName] = descr;
}; };
@ -46,8 +47,12 @@ MySQL.prototype.query = function (sql, callback) {
}); });
}; };
MySQL.prototype.table = function (model) {
return this._models[model].settings.table || model;
};
MySQL.prototype.save = function (model, data, callback) { MySQL.prototype.save = function (model, data, callback) {
var sql = 'UPDATE ' + model + ' SET ' + this.toFields(model, data) + var sql = 'UPDATE ' + this.table(model) + ' SET ' + this.toFields(model, data) +
' WHERE id = ' + data.id; ' WHERE id = ' + data.id;
this.query(sql, function (err) { this.query(sql, function (err) {
@ -60,7 +65,7 @@ MySQL.prototype.save = function (model, data, callback) {
*/ */
MySQL.prototype.create = function (model, data, callback) { MySQL.prototype.create = function (model, data, callback) {
var fields = this.toFields(model, data); var fields = this.toFields(model, data);
var sql = 'INSERT ' + model; var sql = 'INSERT ' + this.table(model);
if (fields) { if (fields) {
sql += ' SET ' + fields; sql += ' SET ' + fields;
} else { } else {
@ -140,7 +145,7 @@ MySQL.prototype.fromDatabase = function (model, data) {
}; };
MySQL.prototype.exists = function (model, id, callback) { MySQL.prototype.exists = function (model, id, callback) {
var sql = 'SELECT 1 FROM ' + model + ' WHERE id = ' + id + ' LIMIT 1'; var sql = 'SELECT 1 FROM ' + this.table(model) + ' WHERE id = ' + id + ' LIMIT 1';
this.query(sql, function (err, data) { this.query(sql, function (err, data) {
if (err) return callback(err); if (err) return callback(err);
callback(null, data.length === 1); callback(null, data.length === 1);
@ -148,7 +153,7 @@ MySQL.prototype.exists = function (model, id, callback) {
}; };
MySQL.prototype.find = function find(model, id, callback) { MySQL.prototype.find = function find(model, id, callback) {
var sql = 'SELECT * FROM ' + model + ' WHERE id = ' + id + ' LIMIT 1'; var sql = 'SELECT * FROM ' + this.table(model) + ' WHERE id = ' + id + ' LIMIT 1';
this.query(sql, function (err, data) { this.query(sql, function (err, data) {
if (data && data.length === 1) { if (data && data.length === 1) {
data[0].id = id; data[0].id = id;
@ -160,7 +165,7 @@ MySQL.prototype.find = function find(model, id, callback) {
}; };
MySQL.prototype.destroy = function destroy(model, id, callback) { MySQL.prototype.destroy = function destroy(model, id, callback) {
var sql = 'DELETE FROM ' + model + ' WHERE id = ' + id + ' LIMIT 1'; var sql = 'DELETE FROM ' + this.table(model) + ' WHERE id = ' + id + ' LIMIT 1';
this.query(sql, function (err) { this.query(sql, function (err) {
callback(err); callback(err);
}); });
@ -168,7 +173,7 @@ MySQL.prototype.destroy = function destroy(model, id, callback) {
MySQL.prototype.all = function all(model, filter, callback) { MySQL.prototype.all = function all(model, filter, callback) {
var sql = 'SELECT * FROM ' + model; var sql = 'SELECT * FROM ' + this.table(model);
var self = this; var self = this;
var props = this._models[model].properties; var props = this._models[model].properties;
@ -259,7 +264,7 @@ MySQL.prototype.all = function all(model, filter, callback) {
}; };
MySQL.prototype.destroyAll = function destroyAll(model, callback) { MySQL.prototype.destroyAll = function destroyAll(model, callback) {
this.query('DELETE FROM ' + model, function (err) { this.query('DELETE FROM ' + this.table(model), function (err) {
if (err) { if (err) {
return callback(err, []); return callback(err, []);
} }
@ -271,7 +276,7 @@ MySQL.prototype.count = function count(model, callback, where) {
var self = this; var self = this;
var props = this._models[model].properties; var props = this._models[model].properties;
this.query('SELECT count(*) as cnt FROM ' + model + buildWhere(where), function (err, res) { this.query('SELECT count(*) as cnt FROM ' + this.table(model) + buildWhere(where), function (err, res) {
callback(err, err ? null : res[0].cnt); callback(err, err ? null : res[0].cnt);
}); });
@ -323,7 +328,7 @@ MySQL.prototype.autoupdate = function (cb) {
var wait = 0; var wait = 0;
Object.keys(this._models).forEach(function (model) { Object.keys(this._models).forEach(function (model) {
wait += 1; wait += 1;
self.query('SHOW FIELDS FROM ' + model, function (err, fields) { self.query('SHOW FIELDS FROM ' + self.table(model), function (err, fields) {
if (!err && fields.length) { if (!err && fields.length) {
self.alterTable(model, fields, done); self.alterTable(model, fields, done);
} else { } else {
@ -423,11 +428,11 @@ MySQL.prototype.alterTable = function (model, actualFields, done, checkOnly) {
}; };
MySQL.prototype.dropTable = function (model, cb) { MySQL.prototype.dropTable = function (model, cb) {
this.query('DROP TABLE IF EXISTS ' + model, cb); this.query('DROP TABLE IF EXISTS ' + this.table(model), cb);
}; };
MySQL.prototype.createTable = function (model, cb) { MySQL.prototype.createTable = function (model, cb) {
this.query('CREATE TABLE ' + model + this.query('CREATE TABLE ' + this.table(model) +
' (\n ' + this.propertiesSQL(model) + '\n)', cb); ' (\n ' + this.propertiesSQL(model) + '\n)', cb);
}; };
@ -468,3 +473,4 @@ function datatype(p) {
} }
return dt; return dt;
} }

View File

@ -66,7 +66,7 @@ function testOrm(schema) {
content: { type: Text }, content: { type: Text },
date: { type: Date, default: Date.now, index: true }, date: { type: Date, default: Date.now, index: true },
published: { type: Boolean, default: false } published: { type: Boolean, default: false }
}); }, {table: 'posts'});
Post.validateAsync('title', function (err, done) { Post.validateAsync('title', function (err, done) {
process.nextTick(done); process.nextTick(done);