【问题标题】:web.input fails in cx_Oraclecx_Oracle 中的 web.input 失败
【发布时间】:2016-09-20 22:56:23
【问题描述】:

我有一个网络服务器,我会将用户数据添加到我的 sql 查询中。它适用于 psycopg,但不适用于 cx_Oracle。

...
class grid:
    def GET(self):
        web.header('Access-Control-Allow-Origin', '*')
        web.header('Access-Control-Allow-Credentials', 'true')
        web.header('Content-Type', 'application/json')

        data = web.input(ID='')
        ido = int(data.ID)
        a = [ido]

        cur = connection.cursor()
        cur.arraysize = 10000

        query = "SELECT a.id AS building_nr, c.geometry.sdo_ordinates AS geometry, d.Classname AS polygon_typ FROM   building a, THEMATIC_SURFACE b, SURFACE_GEOMETRY c, OBJECTCLASS d  WHERE   a.id = b.BUILDING_ID AND b.LOD2_MULTI_SURFACE_ID = c.ROOT_ID AND c.GEOMETRY IS NOT NULL AND b.OBJECTCLASS_ID = d.ID AND a.grid_id_500 = %s;"

        cur.execute(query, a)

它在执行语句之前一直有效。我收到错误消息: 'ascii' 编解码器无法解码位置 36 中的字节 0xfc:序数不在范围内(128)

如何将数据添加到我的查询中?

【问题讨论】:

    标签: python web.py cx-oracle


    【解决方案1】:

    我知道出了什么问题。我不应该将 %s 用于数据。显然,cx_Oracle 默认为“命名”参数样式。

    data = web.input(ID='')
    query = "SELECT ... FROM... WHERE a.id =:grid_id "
    cursor.execute(query, {'grid_id':data.ID})
    

    【讨论】:

    • 是的,使用绑定变量!它们不仅可以提高性能,还可以提高安全性(消除 SQL 注入)。请注意,您还可以执行以下操作: cursor.execute(query, grid_id = data.ID) 或者您还可以执行以下操作 cursor.execute("select ... from ... where a.id = :1", [数据.ID])。 cx_Oracle 支持使用字典或关键字参数的命名参数以及使用列表的数字参数。
    猜你喜欢
    • 2014-06-17
    • 2021-02-28
    • 2018-02-14
    • 1970-01-01
    • 2017-09-22
    • 1970-01-01
    • 2011-06-28
    • 2016-02-21
    • 2022-07-08
    相关资源
    最近更新 更多