orm2 中文文件 1. 連線到資料庫

飛龍發表於2016-01-08

譯者:飛龍

來源:Connecting to Database

在連線之前,你需要一個受支援的驅動。下面是一些測試過的驅動及其版本,把你所需要的加入到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):使用驅動內建的元件管理連線池(僅對mysqlpostgres有效);

  • strdates(預設為false):以字串形式儲存日期(僅對sqlite有效);

  • timezone(預設為local):在資料庫中使用指定的時區儲存日期(僅對mysqlpostgres有效);

debugpool也可以使用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}
});

相關文章