提问人:David 提问时间:8/13/2023 最后编辑:David 更新时间:8/13/2023 访问量:46
MySQL 8 使用占位符插入空间 POINT 数据 (gps),不可能吗?
MySQL 8 inserting spatial POINT data (gps) using placeholders, not possible?
问:
我正在尝试将行插入到表格中,其中一列是 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...
答: 暂无答案
评论