Sequelize批量插入POLYGON类型列出现Invalid value错误如何解决?
问题原因与解决方案
问题原因
queryInterface.bulkInsert是Sequelize提供的底层操作接口,不会触发模型的GEOMETRY类型字段自动序列化逻辑,直接传入GeoJSON格式的多边形对象无法被数据库识别,因此抛出值非法错误。- 迁移文件的回滚逻辑存在表名不匹配问题:up方法创建的表名为
p_zones,down方法指定删除的表名为ZonePoints,后续执行迁移回滚时会触发表不存在错误。
修复方案
1. 修正种子文件代码
需要通过Sequelize内置的fn方法调用空间数据库标准函数ST_GeomFromGeoJSON,将GeoJSON对象转换为数据库可识别的空间格式,示例代码如下:
module.exports = { up: async (queryInterface, Sequelize) => { const polygon = { type: 'Polygon', coordinates: [ [ [10, 10], [20, 10], [20, 20], [10, 20], [10, 10], ], ], }; const data = [{ points: Sequelize.fn('ST_GeomFromGeoJSON', JSON.stringify(polygon)) }]; await queryInterface.bulkInsert('p_zones', data); }, down: async (queryInterface) => { await queryInterface.bulkDelete('p_zones', null, {}); } };
2. 修正迁移文件的回滚逻辑
将down方法中删除的表名修改为实际创建的p_zones:
down: async (queryInterface) => { await queryInterface.dropTable('p_zones'); }
内容的提问来源于stack exchange,提问作者Diego
相关产品推荐
相关产品推荐

