代码之家  ›  专栏  ›  技术社区  ›  Salman

使用node.js在mysql中插入几何值

  •  4
  • Salman  · 技术社区  · 10 年前

    我正在使用 https://github.com/felixge/node-mysql 带有node.js的模块。

    Mysql表具有类型为的字段 POINT 。该模块需要发送数组数组以插入批量记录。但它似乎并没有指定数据类型的选项。

    因此,以下内容自然会用引号括起来

    var loc = "GeomFromText('POINT(" + lat + "," + lon + ")')";
    

    有人试过这个吗?如何说服查询生成器将其视为sql函数?

    或者我必须制作自己的查询生成器吗?

    2 回复  |  直到 10 年前
        1
  •  6
  •   Salem    10 年前

    有一个 pull request 从…起 kevinhikaruevans 你可以这样做,将对象转换为点:

    if (typeof val === 'object') {
        if(val.hasOwnProperty('lat') && val.hasOwnProperty('long')) {
            return 'POINT(' + [val.lat, val.long].map(parseFloat).join(',') + ')';
        }
    }
    

    假设你有一张桌子 mytable 只有字段 point 类型的 POINT ,您可以这样插入它们:

    var points = [
        [{ lat: 1, long: 4}],
        [{ lat: 23, long: -8.345}]
    ];
    var query = connection.query('INSERT INTO mytable(point) VALUES ?', [points], your_callback_func);
    console.log("Query: " + query.sql);
    

    这将生成类似于以下内容的查询:

    INSERT INTO mytable(point)
    VALUES (POINT(1,4)), (POINT(23,-8.345))
    

    这将转换具有这两者的任何对象 lat long 字段设置为MySQL点。如果这不是预期的行为,则可以创建 Point 类,并使用它代替普通对象,在 lib/protocol/SqlString.js 检查该值是否为 指向 .

        2
  •  3
  •   Slopeside Creative    9 年前

    尝试构造要处理的查询 POINT() 和批次,其中 site 是一个具有财产和值的对象,如下所示。这种方法对我有用。

    pool.query('INSERT INTO table SET geometryField = POINT(?,?), ?',[coords.lat,coords.lng,site], function(err, response) {
    
    { sitename: 'A Site',
      customer: 'A Customer',
      country: 'AL',
      timezone: 'America/Los_Angeles',
      address1: '123 My Street',
      city: 'MyCity',
      state: 'WA',
      postalcode: '98110'}