1

我正在使用带有 Express 的 Node,并且正在将我的 ORM 从 Mongoose (Mongo) 移动到 JugglingDB (Postgres),并且很难让 JugglingDB 使用我定义的简单模式。

我的架构如下:

var UserToken = schema.define('UserToken', {
  token: {type: String, index: true}
}, {
  tablename: 'user_token'
});

var User = schema.define('User', {
  email: {type: String, required: true, index: true},
  password_hash: String,
  first_name: String,
  last_name: String,
  role: {type: String, required: true, default: 'member'},
  language: {type: String, default: 'en'},
  api_key: String,
  active: {type: Boolean, required: true, default: true},
  confirmed: Date,
  created: {type: Date, default: function() { return new Date() }},
  modified: Date
}, {
  tablename: 'users'
});

UserToken.belongsTo(User, {as: 'user', foreignKey: 'userId'});

// Define the schema in the DB if it is not there
schema.isActual(function(err, actual) {
  if (!actual) {
    schema.autoupdate();
  }
});

尝试启动节点时出现以下错误:

{ [error: relation "UserToken" does not exist]
  name: 'error',
  severity: 'ERROR',
  code: '42P01',
  detail: undefined,
  hint: undefined,
  position: undefined,
  internalPosition: undefined,
  internalQuery: undefined,
  where: undefined,
  file: 'namespace.c',
  line: '407',
  routine: 'RangeVarGetRelidExtended' }
{ [error: relation "User" does not exist]
  name: 'error',
  severity: 'ERROR',
  code: '42P01',
  detail: undefined,
  hint: undefined,
  position: undefined,
  internalPosition: undefined,
  internalQuery: undefined,
  where: undefined,
  file: 'namespace.c',
  line: '407',
  routine: 'RangeVarGetRelidExtended' }

你能告诉我我错过了什么吗?谢谢你的帮助!

4

2 回答 2

2

对于通过 JugglingDB 定义的任何 PostgreSQL 模式,都需要自动迁移或自动更新。如果表存在,自动迁移函数会销毁该表,然后重新创建它。自动更新功能改变表。

在您的情况下,您将需要在架构定义后执行以下操作:

架构.自动更新();// 或自动迁移

由于自动迁移和自动更新本质上是异步的,因此在创建表之前不应访问它。在这种情况下,您可以使用 q 模块或回调机制来解决此问题。使用 q 模块解决方案的代码片段如下所示:

(如果有帮助,请加注星标:)) https://gist.github.com/woonketwong/7619585

因此,向 JugglingDB 提交了一个拉取请求。该修复更新了迁移 PostgreSQL 架构(以及在表中设置属性)中的规范描述。该请求被接受并合并到主仓库:

https://github.com/1602/jugglingdb/commit/5702d41e2cca2383715ad6b7263b25b7da2f181c

于 2013-12-01T07:21:47.483 回答
2

使用 table 属性指定 tablename,如下所示:

var Organization = schema.define('Organization', {
  name: String,
  slug: String,
  link: String
}, {
  table: 'organizations'
});
于 2013-10-28T10:32:37.553 回答