Sequelize - 如何使用几何值播种数据库?
Posted
技术标签:
【中文标题】Sequelize - 如何使用几何值播种数据库?【英文标题】:Sequelize - How do I seed database with Geometry value? 【发布时间】:2018-04-13 03:13:21 【问题描述】:我使用 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;
;
【问题讨论】:
【参考方案1】:我找到了一个解决方案(或者更确切地说是一种解决方法),结果我需要使用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, )
;
【讨论】:
【参考方案2】:我想补充一下您的答案,如果您想添加 type: 'Polygon'
并作为 geoJson,您可以执行以下操作:
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 是一种比 text 更常见的数据类型。
【讨论】:
以上是关于Sequelize - 如何使用几何值播种数据库?的主要内容,如果未能解决你的问题,请参考以下文章