Sequelize - 如何使用几何值为数据库播种?
Sequelize - How do I seed database with Geometry value?
我使用 Sequelize 连接到我的 PostgreSQL 数据库,在开发过程中,我使用种子文件用示例数据填充数据库。我最近为我的数据库安装了 PostGIS,并希望使用 GEOMETRY('POINT') 类型来描述 latitude/longitude 位置。
但是,我不知道如何使用播种器放置一些 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;
};
我找到了解决方案(或者更确切地说是解决方法),结果我需要使用 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, {})
};
我想补充你的答案,如果你想添加一个 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 是比文本更常见的数据类型。
我使用 Sequelize 连接到我的 PostgreSQL 数据库,在开发过程中,我使用种子文件用示例数据填充数据库。我最近为我的数据库安装了 PostGIS,并希望使用 GEOMETRY('POINT') 类型来描述 latitude/longitude 位置。
但是,我不知道如何使用播种器放置一些 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;
};
我找到了解决方案(或者更确切地说是解决方法),结果我需要使用 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, {})
};
我想补充你的答案,如果你想添加一个 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 是比文本更常见的数据类型。