Python cx_Oracle 绑定变量

2023-12-14

我是一个Python新手,我在使用绑定变量时遇到了麻烦。如果我执行下面的代码,一切都会正常。

bind= {"var" : "ciao"}
sql = "select * from sometable where somefield = :bind"
cur.prepare(sql)
cur.execute(sql,bind)

相反,如果我添加另一个绑定变量,则会出现错误。

bind= {"var" : "ciao"}
sql = "select * from sometable where somefield = :bind and otherfield = :bind"
cur.prepare(sql)
cur.execute(sql,(bind,bind))

cur.execute(sql,(bind,bind))
Oracle.NotSupportedError: Variable_TypeByValue(): unhandled data

我已经解决了

cur.execute(sql,(bind["var"],bind["var"]))

但我不明白为什么前面的命令不行。

哪种是使用绑定变量的正确方法?我正在使用 cx_Oracle。


您滥用了绑定。

可以通过三种不同的方式将变量与 cx_Oracle 绑定see here :

1) 通过将元组传递给 SQL 语句编号变量 :

sql = "select * from sometable where somefield = :1 and otherfield = :2"
cur.execute(sql, (aValue, anotherValue))

2) 通过将关键字参数传递给 SQL 语句带有命名变量 :

sql = "select * from sometable where somefield = :myField and otherfield = :anotherOne"
cur.execute(sql, myField=aValue, anotherOne=anotherValue)

3)通过将字典传递给SQL语句带有命名变量 :

sql = "select * from sometable where somefield = :myField and otherfield = :anotherOne"
cur.execute(sql, {"myField":aValue, "anotherOne":anotherValue})

Remarks

那么为什么你的代码可以工作呢?

让我们尝试了解这里发生了什么:

bind= {"var" : "ciao"}
sql = "select * from sometable where somefield = :bind and otherfield = :bind"
cur.execute(sql,(bind["var"], bind["var"]))

Oracle 会明白它需要一个变量。这是一个命名变量,通过名称链接bind。然后,您应该将参数作为命名参数提供,如下所示:

cur.execute(sql, bind="ciao")

或者使用字典,就像这样:

cur.execute(sql, {bind:"ciao"})

然而,当 cx_Oracle 接收一个元组时,它会回退到按数字绑定,就好像您的 SQL 语句是:

sql = "select * from sometable where somefield = :1 and otherfield = :2"

当你经过时bind['var']两次,这只是字符串"ciao"。它将两个元组项映射到编号变量:

cur.execute(sql, ("ciao", "ciao"))

这是偶然运行的,但代码非常具有误导性。

具有要绑定的单个值的元组

另请注意,第一个选项需要一个元组。但是,如果您要绑定单个值,则可以使用此表示法创建单个值的元组:

sql = "select * from sometable where somefield = :1"
cur.execute(sql, (aValue,))

[编辑]:感谢 @tyler-christian 提到 cx_Oracle 支持传递字典。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python cx_Oracle 绑定变量 的相关文章

随机推荐

  • 使用 Java 8 中的泛型方法对集合进行排序

    以下方法执行排序 public List
  • 每次需要重新绘制时,如何抓取 qwidget /将其渲染在像素图中?

    我有一个 QWidget 我不想在屏幕上显示 相反 我想在每次重新绘制小部件时获取该小部件的像素图 以便将其发送到我正在处理的应用程序的另一部分 API 提供了两种方法来执行此操作 QPixmap grabWidget and QWidge
  • 按关键字进行惯用的 clojure 映射查找

    假设我有一个使用关键字作为键的 clojure 映射 def my car color candy apple red horsepower 450 我知道我可以通过使用关键字或映射作为函数并将另一个作为其参数来查找与关键字关联的值 my
  • Delphi 2009 中的通用 TList<> 在 IndexOf 上崩溃

    我已经看到很多关于 Delphi 2009 泛型中错误的提及 但从未预料到如此基本的东西会在 Update 3 中失败 同样如此 如果列表包含 1 个或多个项目 则在通用 TList 或 TObjectList 上调用 IndexOf 会导
  • 将 R 中的矩阵顺时针旋转 90 度

    我在 R 中有一个这样的矩阵 1 2 3 1 2 3 1 2 3 有没有一种简单的方法可以将整个矩阵顺时针旋转 90 度以获得这些结果 1 1 1 2 2 2 3 3 3 再次旋转 90 度 3 2 1 3 2 1 3 2 1 t不旋转条目
  • EXCEPTION_ACCESS_VIOLATION 崩溃的可能原因是什么?

    当我使用 Eclipse 运行项目的 java bean 时 我收到此崩溃报告 我完全不知道它是什么以及如何调试 谁能告诉我调试这个的可能方法 An unexpected error has been detected by Java Ru
  • 在 .NET 运行时解析 JSON

    我想从 WebServer 得到一些响应 返回的数据如下所示 3014887 string1 string http num60 webservice com u3014887 b c9c0625b jpg 0 3061529 string
  • 在树结构上实现 IEnumerable

    基于这些人的工作 http dvanderboom wordpress com 2008 03 15 treet implementing a non binary tree in c http www matthidinger com a
  • Python 线程。如何锁定线程?

    我试图了解线程和并发的基础知识 我想要一个简单的情况 其中两个线程重复尝试访问一个共享资源 代码 import threading class Thread threading Thread def init self t args thr
  • 使用Scrapy抓取时无法在源代码中找到显示的数据

    我在 Windows Vista 64 位上使用 Python org 版本 2 7 64 位 我使用 Scrapy 和正则表达式的组合从以下页面中名为 DataStore Prime 的 Javascript 项目中提取信息 http w
  • 未终止的字符串文字/无效或意外的标记

    为什么我会 语法错误 未终止的字符串文字 in Firefox and 未捕获的语法错误 无效或意外的标记 in Chrome当我跑 document ready function function addJSBeforeEndBody c
  • 如何在一次 jQuery 调用中在两个文本之间切换?

    假设你有一个 click 称呼 你可以在里面写什么代码 click 调用 以便每次单击所选元素时 都会更改两个字符串之间的文本 我假设 toggle and text 会在这里发挥作用 尝试按照以下思路进行操作 element bind c
  • 同时播放两种声音

    有没有办法同时播放两种声音 我知道SoundPlayer无法做到这一点 我不能使用SoundEffect因为我相信它只是 XNA 的一部分 所需的两个声音将在未知且随机的时间被调用 声音播放后需要进行控制 即 声音必须能够在播放完毕之前停止
  • 在 Android 的导航栏顶部绘制位图

    在我的应用程序中 我需要在所有正在运行的应用程序之上绘制一个位图 我创建了一个不可见的视图 并覆盖在所有应用程序之上 使用此覆盖视图 我可以在给定位置绘制位图 但无法在导航栏顶部绘制位图 我使用了以下布局参数 WindowManager L
  • sphinx可以链接到不在根文档下面的目录中的文档吗?

    我正在使用 Sphinx 来记录一个非 Python 项目 我要分发 doc每个子模块中的文件夹 包含submodule name rst文件来记录该模块 然后 我想将这些文件吸收到主层次结构中 为整个设计创建规范 I e Project
  • 使用 itext 的 XML 工作器

    import java io FileOutputStream import java io StringReader import com itextpdf text Document import com itextpdf text P
  • 为什么 Thread.interrupt() 不能中断尝试获取锁的线程

    Thinking in Java 一书中写道 Thread interrupt 无法中断尝试获取同步锁的线程 我想知道为什么 阻塞操作只有在声明为抛出异常时才能被中断InterruptedException 显然 一个synchronize
  • Python Tkinter 两个按钮的一个回调函数

    我已经寻找这个问题的答案很长时间了 但仍然没有找到任何东西 我正在使用 Tkinter 创建一个 GUI 并且我有两个按钮 除了从不同的小部件接收信息之外 它们基本上执行相同的操作 一个按钮用于条目小部件 另一个按钮用于列表框小部件 这两个
  • “SELECT”语句中的“IF” - 根据列值选择输出值

    SELECT id amount FROM report I need amount to be amount if report type P and amount if report type N 如何将其添加到上面的查询中 SELEC
  • Python cx_Oracle 绑定变量

    我是一个Python新手 我在使用绑定变量时遇到了麻烦 如果我执行下面的代码 一切都会正常 bind var ciao sql select from sometable where somefield bind cur prepare s