【问题标题】:Can I use a PostgreSQL/PostGIS function in a "INSERT" code in psycopg2 (Python)?我可以在 psycopg2 (Python) 的“INSERT”代码中使用 PostgreSQL/PostGIS 函数吗?
【发布时间】:2018-01-19 08:25:42
【问题描述】:

我想在 Python 中使用 psycopg2 模块做一个 INSERT 运算符。

代码是:

cursor.execute('INSERT INTO tb_places (id_street, geom, number, name, first_year, source, id_user, date) VALUES 
(22, ST_GeomFromText("POINT(-518.944 -2698.2069)", 4326), 34, TEST_1, 1950, Almanak96, 6, 2017-08-01)')

当我使用连接来生成 INSERT 字符串时,它可以工作,但是我知道这是一个坏主意。所以我正在尝试使用其他替代方法来避免 SQL 注入。

我试过了:

cursor.execute('INSERT INTO tb_places (id_street, geom, number, name, first_year, source, id_user, date) VALUES (%s, %s, %s, %s, %s, %s, %s, %s)', 
[22, "ST_GeomFromText('POINT(-518.944 -2698.2069)', 4326)", 34, 'TEST_1', 1931, 'Almanak96', 6, '2017-08-01'])

但我收到此错误:

psycopg2.InternalError: parse error - invalid geometry
LINE 1: ...e, first_year, source, id_user, date) VALUES (22, 'ST_GeomFr...
                                                             ^
HINT:  "ST" <-- parse error at position 2 within geometry

基本上问题是当我想插入一些东西时,我无法在字符串中传递 SQL 函数。

有人知道我能做什么吗?

【问题讨论】:

  • 第一个查询是如何工作的?向我们展示未填充值的串联版本。 ST_GeomFromText() 是什么?那是 Python 还是 Postgres 方法?即使是 Postgres,Python 也会出错,因为无法找到该函数。

标签: python sql postgresql postgis psycopg2


【解决方案1】:

最简单的:

cursor.execute('''
    insert into tb_places (
        id_street, geom, number, name, first_year, source, id_user, date
    ) values (%s, ST_GeomFromText(%s, 4326), %s, %s, %s, %s, %s, %s)
    ''', 
    [22, 'point(-518.944, -2698.2069)', 34, 'TEST_1', 1931, 'Almanak96', 6, '2017-08-01']
)

【讨论】:

  • 如何使用 ST_GeomFromText 一次插入多行?
【解决方案2】:

假设 ST_GeomFromText 是您创建的函数,请尝试

geomFromText = ST_GeomFromText('POINT(-518.944 -2698.2069)', 4326) # assign value to var

query = """INSERT INTO tb_places (id_street, geom, number, name, first_year, source, id_user, date) VALUES 
(22, %s, 34, TEST_1, 1950, Almanak96, 6, 2017-08-01)""" % (geomFromText) # make it part of query string

cursor.execute(query) # execute

【讨论】:

    猜你喜欢
    • 2013-09-16
    • 1970-01-01
    • 1970-01-01
    • 2015-06-15
    • 2020-03-30
    • 2017-09-24
    • 2011-09-05
    • 2012-10-19
    • 2020-10-10
    相关资源
    最近更新 更多