譯者:飛龍
在連線之前,你需要一個受支援的驅動。下面是一些測試過的驅動及其版本,把你所需要的加入到package.json
中。
驅動 | npm 包 | 版本 |
---|---|---|
mysql | mysql | 2.0.0-alpha9 |
postgres redshift |
pg | 2.6.2 [1] |
sqlite | sqlite3 | 2.1.7 |
mongodb | mongodb | 1.3.19 |
[1] 如果你要連線到Heroku,請使用版本2.5.0。
這些是測試過的版本,使用其它的版本(新的或者舊的)帶來的風險由你自己承擔。
例如,使用MySQL要這樣做:
$ npm install --save mysql@2.0.0-alpha8
你可以傳遞一個URL字串來連線資料庫,其中scheme為受支援的驅動,或者你可以傳遞一個帶有連線引數的Object
。
var orm = require(`orm`);
orm.connect(`mysql://root:password@localhost/test`, function(err, db) {
if (err) return console.error(`Connection error: ` + err);
// connected
// ...
});
回撥函式只在連線建立成功(或失敗)時呼叫。如果你願意的話,可以不傳入回撥函式,而是監聽connect
事件。
var orm = require(`orm`);
var db = orm.connect(`mysql://root:password@localhost/test`);
db.on(`connect`, function(err) {
if (err) return console.error(`Connection error: ` + err);
// connected
// ...
});
連線URL遵循下面的語法:driver://username:password@hostname/database?option1=value1&option2=value2..
可選引數為:
-
debug
(預設為false
):將連線輸出到控制檯; -
pool
(預設為false
):使用驅動內建的元件管理連線池(僅對mysql
和postgres
有效); -
strdates
(預設為false
):以字串形式儲存日期(僅對sqlite
有效); -
timezone
(預設為local
):在資料庫中使用指定的時區儲存日期(僅對mysql
和postgres
有效);
debug
和pool
也可以使用settings
物件來設定。
連線到多個資料庫
ORM模型受資料庫連線約束,所以如果你需要“多租戶”,即連線到不同的伺服器或資料庫,你可以使用像下面這樣的方法:
// db.js
var connections = {};
function setup(db) {
var User = db.define(`user`, ...);
var Shirt = db.define(`shirt`, ...);
Shirt.hasOne(`user`, User, ...);
}
module.exports = function(host, database, cb) {
if (connections[host] && connections[host][database]) {
return connections[host][database];
}
var opts = {
host: host,
database: database,
protocol: `mysql`,
port: `3306`,
query: {pool: true}
};
orm.connect(opts, function(err, db) {
if (err) return cb(err);
connections[host] = connections[host] || {};
connections[host][database] = db;
setup(db);
cb(null, db);
});
};
// somewhere else, eg, middleware
var database = require(`./db`);
database(`dbserver1`, `main`, function(err, db) {
if (err) throw err;
db.models.user.find({foo: `bar`}, function(err, rows) {
// ...
});
});
連線是被快取的,所以模型在每個伺服器+資料庫上面只會定義一次。由於我們使用了連線池,我們並不需要擔心用完所有的連線,而且我們可以一次性執行多個查詢。
問題排除
如果你在連線MySQL資料庫的時候遇到了如下錯誤:
Error: connect ECONNREFUSED
at errnoException (net.js:670:11)
at Object.afterConnect [as oncomplete] (net.js:661:19)
你可以嘗試新增socketPath
引數:
var db = orm.connect({
host: `localhost`,
database: `database`,
user: `user`,
password: `pass`,
protocol: `mysql`,
socketPath: `/var/run/mysqld/mysqld.sock`,
port: `3306`,
query: {pool: true, debug: true}
});