Sails.js关联填充不同的连接

时间:2014-09-26 20:25:43

标签: sails.js waterline

我有两个型号

国家/地区 - 来自mysql服务器

Country = {
   tableName: 'countries',
   connection: 'someMysqlServer',

   schema: true,
   migrate: 'safe',
   autoCreatedAt: false,
   autoUpdatedAt: false,

   attributes: {
    country_id: {
        type: 'integer',
        primaryKey: true,
        autoIncrement: true
    },
    ....
  }
};

User = {
    connection: 'somePostgresqlServer',

    attributes: {
        id: {
            type: 'integer',
            primaryKey: true,
            autoIncrement: true
        },

        country_id: {
            model: 'country'
        },

$> User.findOneById(1).populate( 'COUNTRY_ID')。EXEC(执行console.log)

并收到错误

sails> Error (E_UNKNOWN) :: Encountered an unexpected error
: Unable to determine primary key for collection `countries` because an error was encountered acquiring the collection definition:
[TypeError: Cannot read property 'definition' of undefined]
  at _getPK (/projects/foturist-server/node_modules/sails-postgresql/lib/adapter.js:923:13)
  at StrategyPlanner.__FIND__.Cursor.$getPK (/projects/foturist-server/node_modules/sails-postgresql/lib/adapter.js:504:20)
.....

Details:  Error: Unable to determine primary key for collection `countries` because an error was encountered acquiring the collection definition:
[TypeError: Cannot read property 'definition' of undefined]

为什么国家/地区协会使用postgre-connection?

1 个答案:

答案 0 :(得分:0)

好吧,由于这两个模型位于不同的数据库连接上,因此您无法进行实际的SQL连接。我认为你需要的是

User.find({id: 1}).exec(function(user) { 
    var theUser = user;
    Country.find(user.country_id)
    .exec(function(country) {
        theUser.country = country;
        return theUser;
    }); });

我不确定您要解决的具体需求是什么,但由于国家/地区的查找表不太可能经常更改,并且在完全不同的数据存储中,我建议将此数据缓存在Redis之类的内容中或Memcache。然后在您的用户查找回调上,您可以从缓存商店中按ID获取国家/地区。除非您希望此数据定期更改,否则速度会快得多。您可以编写一个在其他数据库中执行延迟查找的服务,然后从缓存中提供服务,或者在应用程序启动时预先缓存它们。