Sequelize - 如何使用Geometry值对数据库进行种子设定?

时间:2017-10-31 20:32:02

标签: node.js postgresql sequelize.js postgis sequelize-cli

我使用Sequelize连接到我的PostgreSQL数据库,在开发过程中,我使用种子文件用示例数据填充数据库。我最近为我的数据库安装了PostGIS,并希望使用GEOMETRY(' POINT')类型来描述纬度/经度位置。

但是,我不知道如何使用播种机放置一些GEOMETRY数据。我尝试按照Sequelize docs中的示例进行操作:

module.exports = {
    up: (queryInterface, Sequelize) =>
        queryInterface.bulkInsert('Vets', [{
            title: 'Centrum Zdrowia Małych Zwierząt',
            city: 'Poznań',
            googleMapsID: 'ChIJQ8EgpGpDBEcR1d0wYZTGPbI',
            position: {
                type: 'Point',
                coordinates: [52.458415, 16.904740]
            },
            rodents: true
        }], {}),
    down: (queryInterface, Sequelize) =>
        queryInterface.bulkDelete('Vets', null, {})
};

但是当我运行sequelize db:seed:all命令时,会发生以下错误:

ERROR: Invalid value [object Object]

我想我只需要以其他方式指定位置,但是Sequelize文档并没有提到任何种子。任何人都可以帮我解决这个问题吗?

Vets数据库的迁移文件如下:

module.exports = {
  up: (queryInterface, Sequelize) => queryInterface.createTable('Vets', {
    ...
    rodents: {
      type: Sequelize.BOOLEAN
    },
    position: {
      type: Sequelize.GEOMETRY
    },
    websiteUrl: {
      type: Sequelize.STRING
    },
    ...
  }, {
    indexes: [
      {
        unique: true,
        fields: ['title', 'city']
      }
    ]
  }),
  down: (queryInterface, Sequelize) =>
    queryInterface.dropTable('Vets')
};

模型定义:

module.exports = (sequelize, DataTypes) => {
  const Vet = sequelize.define('Vet', {
    ...
    rodents: {
      type: DataTypes.BOOLEAN,
      defaultValue: false
    },
    position: DataTypes.GEOMETRY('POINT'),
    websiteUrl: DataTypes.STRING,
    ...
  }, {
    indexes: [
      {
        unique: true,
        fields: ['title', 'city']
      }
    ]
  });

  Vet.associate = (models) => {
    Vet.belongsTo(models.User, { as: 'suggestedBy' });
    Vet.belongsTo(models.User, { as: 'acceptedBy' });
  };

  return Vet;
};

2 个答案:

答案 0 :(得分:2)

我找到了一个解决方案(或者更确切地说是一种解决方法),结果我需要使用Sequelize.fn()

module.exports = {
  up: (queryInterface, Sequelize) =>
    queryInterface.bulkInsert('Vets', [
      {
        ...
        position: Sequelize.fn('ST_GeomFromText', 'POINT(52.458415 16.904740)'),
        ...
      }
    ], {}),
  down: (queryInterface, Sequelize) =>
    queryInterface.bulkDelete('Vets', null, {})
};

答案 1 :(得分:1)

我想补充一下您的答案,即如果您想添加type: 'Polygon'并作为地名,则可以执行以下操作:


  up: (queryInterface, Sequelize) => {


    const polygon = { type: 'Polygon', coordinates: [
      [ [100.0, 0.0], [101.0, 0.0], [101.0, 1.0],
        [100.0, 1.0], [100.0, 0.0] ]
      ]};

    const cityCreated = {
   ....
      boundaries: Sequelize.fn('ST_GeomFromGeoJSON', JSON.stringify(polygon)),
   ....
    }

    return queryInterface.bulkInsert('cities', [cityCreated], {});
  },

在这种情况下,列boundaries是定义为GEOMETRY的列

这对于增加边界非常有用,并且geoJson是比文本更通用的dataType。