python - 使用 Python 进行 INSERT INTO 和字符串连接

标签 python postgis psycopg2

我在将数据插入我的数据库时遇到了重大障碍。从下面的代码中可以看出,我只是在构建 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()

最佳答案

您正在传递字符串 ST_GeomFromText('POINT(..)') 作为参数,而 psycopg2 正在转义它。但是 ST_GeomFromText(..) 是一个 PostGIS 函数,而不是您要插入的数据。

要解决此问题,您需要将 ST_GeomFromText 函数移动到静态 SQL 中。例如:

sql = '''
   INSERT INTO foo (point_geom, poly_geom)
   VALUES (ST_PointFromText(%s, 4326), ST_GeomFromText(%s, 4326))'''
params = ['POINT( 20 20 )', 'POLYGON(( 0 0, 0 10, 10 10, 10 0, 0 0 ))']
cur.execute(sql, params)

关于python - 使用 Python 进行 INSERT INTO 和字符串连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6117646/

相关文章:

python - Selenium -无法找到youtube搜索栏

python - Azure Web作业导入错误: No module named email_validator

python - 使用python psycopg2保存二进制数据时如何修复 "can' t adapt error

python - 使用 psycopg2 插入多行

python - 剪切零字符(字符串[:-0]) from string - Python

python - tf.reshape 在添加额外维度的情况下不起作用

sql - 在 PostgreSQL 列中混合使用 POINT 和 LINESTRING 对象。如何从 LINESTRING 中提取 POINT 和第一个点?

java - 使用 Spring JDBC 插入 postgis MultiPolygon 数据类型时出错

postgresql - 优化包含测试数据的dockerized postgres数据库的(磁盘/内存)

python - 如何在使用 psycopg2.extras.RealDictCursor 时保留列顺序