【问题标题】:prevent python from escaping quotes in sql queries防止python在sql查询中转义引号
【发布时间】:2020-07-26 07:21:31
【问题描述】:

我正在使用带有 postgis 扩展的 postgres 数据库。我必须使用 python 作为后端将数据插入到 postgres 中。我正在使用 psycopg2 进行连接,我的 python 版本是 3.7 。我无法推送我的数据,因为 python 一直在转义字符串文字。以下是我的代码。

def insert(lvalues):
    lvalues = [str(i) for i in lvalues]
    values = ', '.join(lvalues)
    return values


if __name__ == '__main__':
    cursor, conn = connect()
    cord = [
        [
            [
                67.774658203125,
                25.69103802005013
            ],
            [
                68.90625,
                24.367113562651262
            ],
            [
                73.970947265625,
                25.958044673317843
            ],
            [
                74.87182617187499,
                28.565225490654658
            ],
            [
                70.33447265624999,
                28.815799886487298
            ],
            [
                67.774658203125,
                25.69103802005013
            ]
        ]
    ]
    js = insert(('GISid', 'srid', 'familyid', 'geom', 'nameofgeom'))
    jst = '''{  "type": "Polygon","coordinates": ''' + str(cord) + ''',
                      "crs": {"type": "name", "properties": {"name": "EPSG:4326"}}
            }'''


    print(cursor.mogrify(
        "INSERT INTO public.spatial_data(gid, srid, familyid, geom, nameofgeom) VALUES (103,4326,2,ST_GeomFromGeoJSON(%s),'polygon') ",
        (jst,)))

我得到的结果如下:

b'INSERT INTO public.spatial_data(gid, srid, familyid, geom, nameofgeom) VALUES (103,4326,2,ST_GeomFromGeoJSON(\'{  "type": "Polygon","coordinates": [[[67.774658203125, 25.69103802005013], [68.90625, 24.367113562651262], [73.970947265625, 25.958044673317843], [74.87182617187499, 28.565225490654658], [70.33447265624999, 28.815799886487298], [67.774658203125, 25.69103802005013]]],\n        "crs": {"type": "name", "properties": {"name": "EPSG:4326"}}\n            }\'),\'polygon\') '

有人可以建议一种删除 mogrify 结果中出现的 \ 和 \n 的方法。 cursor 是 psycopg2 连接游标对象。 提前谢谢你。

【问题讨论】:

    标签: python-3.x geospatial postgis


    【解决方案1】:

    如果您使用cursor.execute 而不是.mogrify 会发生什么?听起来它已经在做正确的事情了......

    • 无论如何,反斜杠来自print 语句,不会发送到数据库。

    • 如果你确实需要去掉换行符,它们都来自jst 变量;使用类似:jst.replace('\n', ' ')

    【讨论】:

    • cursor.mogrify 给出了将被插入或传递给执行函数的确切代码。即使在文档中,他们也使用了打印语句,并且没有看到这样的问题。我实现了程序运行的您的建议,但查询没有在表中插入任何内容。
    • print 的输出以b' 开头的事实意味着它正在打印值的repr 形式(这是一个字节,而不是一个字符串);如果您想查看查询的文本,则必须将其解码回字符串以进行打印。至于查询没有插入任何东西 - 你能检查返回值,它可能会给你插入的行数吗?你在一个事务中,所以当你退出程序而不提交时它会被回滚?
    • 它没有提交,因为数据库拒绝了 repr 表单,但没有显示错误。如果您编辑您的答案以包含第二条评论,我将接受它作为答案@sabik
    • 您不应该将print 的输出发送到数据库,但是,您应该使用cursor.execute?
    【解决方案2】:

    虽然 mogrify 给出的语句类似于使用 execute 命令执行的语句,但它给了我们一个 repr 版本。如果计划直接使用 mogrify 输出应该会有问题,但如果您使用单独的执行语句,它可能会导致错误。(不一定)。字符串替换帮助我摆脱了这个问题。

    jst.replace('\n', ' ').replace("\'",' ')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-07
      • 2017-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-24
      • 1970-01-01
      • 2018-09-14
      相关资源
      最近更新 更多