【问题标题】:How do you make the Python Msqldb module use ? in stead of %s for query parameters?你如何让 Python Mysqldb 模块使用?而不是 %s 用于查询参数?
【发布时间】:2010-10-23 22:15:22
【问题描述】:

MySqlDb 是一个很棒的 Python 模块——但有一部分非常烦人。 查询参数如下所示

cursor.execute("select * from Books where isbn=%s", (isbn,))

而在已知宇宙中的其他任何地方(oracle、sqlserver、access、sybase...) 它们看起来像这样

cursor.execute("select * from Books where isbn=?", (isbn,))

这意味着如果你想要便携,你必须以某种方式切换 在两个符号之间?和 %s, 这真的很烦人。 (请不要告诉我使用 ORM 层——我会勒死你)。

据说你可以说服 mysqldb 使用标准语法,但我还没有 让它工作。有什么建议吗?

【问题讨论】:

  • 实际上,最近的系统已经命名参数看起来像这样:“select * from Books where isbn= @ISBN”

标签: python sql mysql database


【解决方案1】:

我发现很多关于paramstyle 的信息似乎暗示它可能是你想要的,但是according to this wiki 你必须使用你的库使用的paramstyle,其中大多数不允许你改变它:

paramstyle 特定于您使用的库,并且提供信息 - 您必须使用它使用的库。这可能是该标准中最烦人的部分。 (少数允许您设置不同的paramstyles,但这不是标准行为)

我发现一些帖子谈到 MySQLdb 允许这样做,但显然它并没有,因为有人表示它不适用于他们。

【讨论】:

  • 这对我不起作用,我很确定我有最新版本的 MySQLdb。这真的是它的全部吗?
  • 那里有很多信息暗示它是,但文档(至少我能找到的)不是很可靠,所以我真的不知道。
【解决方案2】:

据我所知,您不能使用“?”对于参数标记 MySQLdb(开箱即用)

可以但是使用命名参数

cursor.execute("%(param1)s = %(param1)s", {'param1':1})

将有效地执行 1=1

在mysql中

有点像 Eli 的回答(但不是 hackish)

你可以这样做:

MyNewCursorModule.py

import MySQLdb.cursors import Cursor

class MyNewCursor(Cursor):
  def execute(self, query, args=None):
     """This cursor is able to use '?' as a parameter marker"""
     return Cursor.execute(self, query.replace('?', '%s'), args)

  def executemany(self, query, args):
     ...implement...

在这种情况下,您将拥有一个自定义光标,可以执行您希望它执行的操作 并且这不是黑客攻击。它只是一个子类;)

并将其用于:

from MyNewCursorModule import MyNewCursor

conn = MySQLdb.connect(...connection information...
                       cursorclass=MyNewCursor)

(如果您想在大多数情况下使用正常执行(临时覆盖),您也可以将类提供给 connection.cursor 函数以在那里创建它)

...您还可以将简单替换更改为更正确的内容 (假设有办法逃避问号),但这是我会的 留给你:)

【讨论】:

    【解决方案3】:

    我不建议这样做,但最简单的解决方案是猴子补丁 Cursor 类:

    from MySQLdb.cursors import Cursor
    old_execute = Cursor.execute
    def new_execute(self, query, args):
       return old_execute(self, query.replace("?", "%s"), args) 
    Cursor.execute = new_execute
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-28
      • 1970-01-01
      • 2014-02-12
      • 2018-01-02
      • 1970-01-01
      • 1970-01-01
      • 2014-11-09
      • 2013-03-19
      相关资源
      最近更新 更多