【问题标题】:Pass dynamic database function to psycopg2 cursor.execute(statement, params)将动态数据库函数传递给 psycopg2 cursor.execute(statement, params)
【发布时间】:2012-07-11 19:52:01
【问题描述】:

我通过 psycopg2 运行以下语句(有效):

self.cursor.execute( """INSERT INTO """ + self.config.schema + """.parcel (
    id,geometry) VALUES (%s, ST_GeomFromGML(%s))""", (self.id, self.geometry)

但现在我需要介绍一些动态,并想尝试这样的事情:

if multi:
    mygeom = "ST_Multi(ST_GeomFromGml(" + self.geometry + "))"
else 
    mygeom = "ST_GeomFromGml(" + self.geometry + ")"

self.cursor.execute( """INSERT INTO """ + self.config.schema + """.parcel (
    id,geometry) VALUES (%s, %s)""", (self.id, mygeom)

当然,这会失败很长时间,因为它将整个函数解析为转义字符串。有没有人对如何解析数据库函数以在执行语句中动态解析它们有任何经验,或者这是不可能的?

【问题讨论】:

    标签: python postgis psycopg2


    【解决方案1】:

    self.cursor.execute("INSERT INTO {}.parcel (id,geometry) VALUES (%s, %s)".format(self.config.schema), (self.id, mygeom))

    【讨论】:

      【解决方案2】:
      if multi:
          mygeom = "ST_Multi(ST_GeomFromGml(%s))"
      else:
          mygeom = "ST_GeomFromGml(%s)"
      
      self.cursor.execute( """INSERT INTO {}.parcel (
          id,geometry) VALUES (%s, {})""" .format(self.config.schema, mygeom) , (self.id, self.geometry) )
      

      我使用字符串format 方法插入了架构和函数。我还以安全的方式插入了self.geometry

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-30
        • 1970-01-01
        相关资源
        最近更新 更多