MySQL 8 使用占位符插入空间 POINT 数据 (gps),不可能吗?

MySQL 8 inserting spatial POINT data (gps) using placeholders, not possible?

提问人:David 提问时间:8/13/2023 最后编辑:David 更新时间:8/13/2023 访问量:46

问:

我正在尝试将行插入到表格中,其中一列是 GPS 坐标。稍后将根据行与给定坐标集的距离来选择行,因此我想使用 POINT 数据类型来利用内置函数来执行此操作。

我的程序为所有其他数据正确地构建了查询字符串和正确数量的“%s”占位符,但是当我尝试对空间数据执行相同的操作时,我无法让它工作,给出

Error #1416 - Cannot get geometry object from data you send to the GEOMETRY field". 
Spatial data string is: "ST_GeomFromText('POINT(2 2)', 4326)"

如果我将确切的字符串直接放入查询中,它会正确运行,但是如果我认为将该字符串放入变量中并使用 %s 插入,则会出现上述错误。

point2 = "ST_GeomFromText('POINT(2 2)', 4326)"
my_name = "Test1"
point = "POINT(3 3)"

# Placeholder for "name" string, no placeholder for POINT. This works correctly:
mycursor.execute(
    "INSERT INTO person (name, gps) VALUES (%s, ST_GeomFromText('POINT(2 3)', 4326));",
    (my_name,),
)

# Placeholder for POINT string, works correctly:
mycursor.execute(
    "INSERT INTO person (name, gps) VALUES (%s, ST_GeomFromText(%s, 4326));",
    (my_name, point),
)

# This is what I want to do, but won't work:

mycursor.execute(
    "INSERT INTO person (name, gps) VALUES (%s, %s);",
    (my_name3, point2),
)

似乎只要我尝试在ST_GeomFromText部分使用占位符,它就不起作用。但是,我执行错误消息显示它正在尝试将数据解释为空间数据,因此它正在识别它。

我觉得我一定错过了一些明显的东西,但我花了几个小时尝试不同的组合,但无法让它发挥作用。

如果有人愿意再看一看,我将不胜感激!

谢谢。

编辑:

我正在使用 mysql.connector 版本 8.1.0

从日志中,我可以看到工作查询提交为:

INSERT INTO person (name, gps) VALUES ('Test11asd', ST_GeomFromText('POINT(3 3)', 4326))

而非工作查询则作为以下方式提交:

INSERT INTO person (name, gps) VALUES ('Test3', 'ST_GeomFromText(\'POINT(2 2)\', 4326)')

不同之处在于,使用占位符,它在“ST_GeomFromText”部分周围添加了额外的引号。我推测是因为它试图将字符串插入查询字符串中。但是我看不到删除它们的方法,因为我必须将其保存为 python 变量中的字符串,即

point2 = "ST_Geom..." 

我不能做:

point2 = ST_Geom...
空间 mysql 连接器-python

评论


答: 暂无答案