Node/Express 项目:创建“加入类/模型”并将其同步到 Postgres 数据库

Posted

技术标签:

【中文标题】Node/Express 项目:创建“加入类/模型”并将其同步到 Postgres 数据库【英文标题】:Node/Express Project: Create and Sync a "Join Class/Model" to a Postgres Database 【发布时间】:2016-10-19 00:33:36 【问题描述】:

我正在构建一个已在 Rails 中构建的应用程序的 Node/Express/Postgres 版本。我正在学习 Node,所以我想我会重建一些我知道有效的东西。

现在,我将所有内容都转储到一个文件中(设置我的数据库、定义我的模型等),只是为了确保在将它们分成不同的文件之前我已经正确设置了所有内容。

我在文件的最顶部设置了我的 postgres 数据库,如下所示:

var Sequelize = require('sequelize');

var db = new Sequelize('my_database_name', 'my_username', null, 
  host: 'localhost',
  dialect: 'postgres',
);

关于我的模型,我有一个政治家模型:

var Politician = db.define("politician", 
  name: 
   type: Sequelize.STRING,
,
  politicalParty: 
   type: Sequelize.STRING
 
);

A 类别模型:

var Category = db.define("category", 
  name: 
    type: Sequelize.STRING
  ,
  keywords: 
    type: Sequelize.ARRAY(Sequelize.TEXT)
  ,
 );

还有一个政治家和类别的连接模型,称为“兴趣”。因为兴趣是一个连接模型,它会有一个“politicianId”和“categoryId”属性......但是这些属性会自动在数据库中生成吗?那么,这就是我将如何定义没有属性的兴趣模型吗?

兴趣模型:

 var Interest = db.define("interest")

或者,我是否必须具体并创建“politicianId”和“categoryId”属性?像这样:

兴趣模型:

var Interest = db.define("interest", 
   id: 
    type: Sequelize.INTEGER,
    primaryKey: true,
    autoIncrement: true
  ,
  categoryId: 
   type: Sequelize.INTEGER,
   foreignKey: true
 ,
 politicianId: 
   type: Sequelize.INTEGER,
   foreignKey: true
 
);

另外,我需要“foreignKey:true”位吗?或者它会自动知道这些属性是外键吗?另外,我需要“id”属性吗?我知道模型会自动创建他们自己的主键“id”......但同样,我已经做了几个小时,查看文档并尝试一切。

然后我定义了我的关联(同样,所有这些都是同一个文件):

Politician.belongsToMany(Category, through: "Interest");
Category.belongsToMany(Politician, through: "Interest");

The Node/Sequelize docs 似乎暗示定义上面的这两个关联将自动“创建一个名为 Interest 的新模型,具有等效的外键政治 Id 和 categoryId。”那么,我什至需要定义一个“兴趣”模型吗?另外,我是否需要以下关联来描述兴趣属于政治家和类别?

Interest.belongsTo(Politician);
Interest.belongsTo(Category);

如果我不写关联说兴趣属于政治和类别,我不会在兴趣表中获得“politicianId”和“categoryId”列。只是“id”和 createdAt/updatedAt 列。

然后我创建了一个 Politician、Category 和 Interest 的实例,将所有内容保存到数据库中,查看是否所有内容都存在并正确设置:

政客对象:

var politician1 = Politician.sync(force: true).then(function()
   return Politician.create(aPoliticianObjectDefinedInthisFile);
);

这非常有效。我在数据库的政治表中看到了这个对象。

类别对象:

var category1 = Category.sync(force: true).then(function()
  return Category.create(aCategoryObjectDefinedInThisFile);
 );

这非常有效。我在数据库的类别表中看到了这个对象。

这是行不通的。创建感兴趣的实例/对象并将其同步到数据库。我的想法是,如果我将整数作为值,它会知道“politicianId:1”表示指向 id 为 1 的政治家对象,“categoryId:1”也是如此。但是当我按照下面的方式编写它时,兴趣表甚至根本不会出现在 Postgres 数据库中。

兴趣对象:

Interest.sync(force: true).then(function()
  return Interest.create(
     
      politicianId: 1,
      categoryId: 1
     
   );
 );

但是,当我像这样创建感兴趣的对象时,定义了 no 属性,兴趣表与“politicianId”和“categoryId”列一起出现在数据库中,但是,那些列是。对象的主 ID 位于 1 处,“createdAt”和“updatedAt”列也有数据。但是外键列是空白的。

兴趣对象:

Interest.sync(force: true).then(function()
   
     return Interest.create(
       
   // No properties defined. 
       
    );
  
);

很抱歉这篇长文,哈哈,但是,总而言之: 我是否正确地创建了“兴趣”模型? 我是否正确地编写了“兴趣”的关联? 如果我已经为其父类、Politican 和 Category 定义了关联,我是否还需要为其编写关联?

在我的 Rails 应用程序中,我对 Politan 和 Category 的关联如下:

政治家有很多兴趣 政治家通过兴趣拥有_many 类别

类别有_很多兴趣 类别 has_many 政治家通过兴趣

兴趣属于政治家 兴趣属于_to 类别

但我在 Node 中使用了“belongsToMay”关联,因为我收到一个错误提示我这样做。

基本上,我需要创建 Politician 实例、Category 实例和具有“politicianId”和“categoryId”列的兴趣实例,这些列指向这些类的上述实例。

politicanABC -- id: 1 categoryABC -- id: 1 instanceABC——id:1; politicanId:1(指politicanABC); categoryid:1(指categoryABC)。

我的应用程序在 Rails 中是这样设置的,并且运行良好。 提前帮助并感谢您:-)

【问题讨论】:

【参考方案1】:

如果您不打算添加任何其他字段,则不必定义兴趣模型。一旦您执行以下操作,Sequelize 将在内部定义模型并添加所有必填字段:

Politician.belongsToMany(Category, through: "Interest");
Category.belongsToMany(Politician, through: "Interest");

同步需要在数据库级别而不是表上运行,因为此时兴趣模型是隐式的。

db.sync(force: true);

Sequelize 将在 Politician 和 Category 实例上添加关系构建方法。类别将有方法addPolitician()addPoliticians([])setPoliticians([])getPliticians()。政客实例将具有相似的功能来将类别与它们关联起来。成功对两个对象执行创建选项后,您可以连接它们。

Politician.create(name: 'John Doe', politicalParty: 'Nice Party') 
  .then(function(politician)  
    Category.create(name: 'Nicers') 
     .then(function(category)  
       politician.addCategory(category); 
     ); 
  );

您还可以使用辅助方法搜索和关联现有项目。或者,您可以通过访问 db.models.Interest 模型并在其上运行创建来手动关联对象。

【讨论】:

谢谢你。我在数据库中看到了一个兴趣模型。但是,当我写“db.sync(force: true);”时然后是“Politician.create(name: 'John Doe',...”), 对不起,我没有合作 抱歉,我之前的 2 次尝试都没有完成我的评论,而且我没有看到“编辑”按钮。当我写“db.sync(force: true);”然后是“Politician.create(name: 'John Doe',,"......我在我的数据库中没有看到任何数据......在政治家、类别或兴趣模型中没有任何内容. 我在运行时也收到此错误:未处理的拒绝 SequelizeDatabaseError: 关系“兴趣”不存在 新建一个数据库,重新运行代码。一切对我来说都很好。这是我刚刚检查的 -> pastebin.com/jdPLsjuj 很奇怪,这对我不起作用。 Faheem,您创建了 Politcan 和 Category 的实例,但您没有将其“同步”到数据库。如果你不做 Politician.sync(force: true).then(function() return Politician.create(barackObama); );,它是如何持久化到数据库的

以上是关于Node/Express 项目:创建“加入类/模型”并将其同步到 Postgres 数据库的主要内容,如果未能解决你的问题,请参考以下文章

node+express创建第一个node项目

vueCli+node+express+mysql 前后端分离项目

夺命雷公狗---node.js---16之项目的构建在node+express+mongo的博客项目1

centos7 node express项目 将http接口升级为https接口的解决方法

node Express安装与使用

IDEA创建第一个nodejs项目出现的问题