使用 Python 进行 INSERT INTO 和字符串连接
我在将数据插入数据库时遇到了重大障碍。您可以从下面的代码中看到,我只是构建 SQL 语句以传递给执行命令。这些值是正确的,一切都很好,但 python 解释器似乎在运行时添加和删除参数中的引号。
这是将空间数据插入数据库的正确方法。
INSERT INTO my_table(
name, url, id, point_geom, poly_geom)
VALUES ('test', 'http://myurl', '26971012',
ST_GeomFromText('POINT(52.147400 19.050780)',4326),
ST_GeomFromText('POLYGON(( 52.146542 19.050557, bleh, bleh, bleh))',4326));
这可以在 Postgres 查询编辑器中进行验证...现在,当我运行下面的 Python 代码时,它会在 ST_GeomFromText 函数周围添加双引号,然后从 id 列中删除引号。
INSERT INTO my_table(
name, url, id, point_geom, poly_geom)
VALUES ('test', 'http://myurl', 26971012,
"ST_GeomFromText('POINT(52.147400 19.050780)',4326)",
"ST_GeomFromText('POLYGON(( 52.146542 19.050557, 52.148430 19.045527, 52.149525 19.045831, 52.147400 19.050780, 52.147400 19.050780, 52.146542 19.050557))',4326)");
这会导致插入失败,并且 PostGIS 声称它不是正确的几何图形。当我打印每个参数以在屏幕上查看时,引号中没有什么有趣的事情,所以我认为问题一定出在执行命令中。我正在使用 Python 2.7...任何人都可以帮忙如何防止这种疯狂行为继续下去吗?
conn = psycopg2.connect('dbname=mydb user=postgres password=password')
cur = conn.cursor()
SQL = 'INSERT INTO my_table (name, url, id, point_geom, poly_geom) VALUES (%s,%s,%s,%s,%s);'
Data = name, url, id, point, polygon
#print Data
cur.execute(SQL, Data)
conn.commit()
cur.close()
conn.close()
I have hit a major speed bump in inserting data in to my DB. You can see from the code below that I am simply building the SQL statement to pass in to the execute command. The values are correct and all is well there but the python interpreter seems to be adding and removing quotes from the params at runtime.
This is the correct way to insert spatial data in to the DB.
INSERT INTO my_table(
name, url, id, point_geom, poly_geom)
VALUES ('test', 'http://myurl', '26971012',
ST_GeomFromText('POINT(52.147400 19.050780)',4326),
ST_GeomFromText('POLYGON(( 52.146542 19.050557, bleh, bleh, bleh))',4326));
This is verifiable in the Postgres query editor...Now, when I run the Python code below It adds double quotes around the ST_GeomFromText function and then removes the quotes from the id column.
INSERT INTO my_table(
name, url, id, point_geom, poly_geom)
VALUES ('test', 'http://myurl', 26971012,
"ST_GeomFromText('POINT(52.147400 19.050780)',4326)",
"ST_GeomFromText('POLYGON(( 52.146542 19.050557, 52.148430 19.045527, 52.149525 19.045831, 52.147400 19.050780, 52.147400 19.050780, 52.146542 19.050557))',4326)");
This causes the insert to fail and PostGIS is claiming that it's not a proper Geometry. When I print each one of the params to view on the screen, there is nothing funny going on with the quotes so I'm thinking that the problem must be in the execute command. I am using Python 2.7...Can anyone lend a hand on how to prevent this craziness from continuing?
conn = psycopg2.connect('dbname=mydb user=postgres password=password')
cur = conn.cursor()
SQL = 'INSERT INTO my_table (name, url, id, point_geom, poly_geom) VALUES (%s,%s,%s,%s,%s);'
Data = name, url, id, point, polygon
#print Data
cur.execute(SQL, Data)
conn.commit()
cur.close()
conn.close()
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
您将字符串
ST_GeomFromText('POINT(..)')
作为参数传递,而 psycopg2 正在对其进行转义。但是ST_GeomFromText(..)
是 PostGIS 函数,而不是您要插入的数据。要解决此问题,您需要将 ST_GeomFromText 函数移至静态 SQL 中。例如:
You are passing the string
ST_GeomFromText('POINT(..)')
as a parameter, and psycopg2 is escaping it. HoweverST_GeomFromText(..)
is a PostGIS function, not data you are inserting.To fix this you need to move the
ST_GeomFromText
function into the static SQL. For example:最好(编辑:比你正在做的事情,而不是第一个答案)做这样的事情:
并将其与元组中的坐标一起传递给你的适配器,它们将被正确解析。这是迄今为止最不痛苦的方法。如果您确实必须单独构造字符串,则可以通过查看 cur.mogrify 的输出来清理转义:
抵制在 sql 查询字符串上使用字符串格式化方法的诱惑,即使这些事情可能会令人沮丧。
It is better (edit: than what you are doing, not than 1st answer) to do something like this:
And pass that to your adapter with the coords in a tuple, they will be parsed correctly. This is by far the least painful way to do it. If you really have to construct the strings separately, you might clean up the escaping by looking a the output of
cur.mogrify
:Resist the temptation to use a string formatting method on a sql query string, even though these things can be frustrating.