代码之家  ›  专栏  ›  技术社区  ›  rubayeet

python支持mysql准备的语句吗?

  •  46
  • rubayeet  · 技术社区  · 15 年前

    我之前在一个PHP项目中工作过,在这个项目中,准备好的语句使select查询速度提高了20%。

    我想知道它是否适用于python?我似乎找不到任何具体说它做或不做的东西。

    7 回复  |  直到 8 年前
        1
  •  12
  •   Community Radu Dragan    7 年前

    直接回答,不,没有。

    joshperry's answer 是一个很好的解释。

    eugene y answer to a similar question ,

    检查mysqldb Package Comments :

    mysqldb中的“参数化”是通过转义字符串,然后盲目地将它们插入查询,而不是使用 MySQL STmt API。因此,Unicode字符串必须通过两个 中间表示(编码字符串、转义编码字符串) 在数据库收到它们之前。

    所以答案是:不,不是。

        2
  •  58
  •   joshperry    15 年前

    大多数语言都提供了一种执行通用参数化语句的方法,python也不例外。当使用参数化查询时,支持准备语句的数据库将自动执行此操作。

    在python中,参数化查询如下所示:

    cursor.execute("SELECT FROM tablename WHERE fieldname = %s", [value])
    

    具体的参数化样式可能会有所不同,具体取决于您的驱动程序,您可以导入DB模块,然后执行 print yourmodule.paramstyle .

    PEP-249 :

    帕拉姆式

           String constant stating the type of parameter marker
           formatting expected by the interface. Possible values are
           [2]:
    
               'qmark'         Question mark style, 
                               e.g. '...WHERE name=?'
               'numeric'       Numeric, positional style, 
                               e.g. '...WHERE name=:1'
               'named'         Named style, 
                               e.g. '...WHERE name=:name'
               'format'        ANSI C printf format codes, 
                               e.g. '...WHERE name=%s'
               'pyformat'      Python extended format codes, 
                               e.g. '...WHERE name=%(name)s'
    
        3
  •  10
  •   shylent    15 年前

    在快速浏览mysqldb包的cursor对象的execute()方法(我猜是一种与mysql集成的事实上的包)之后,它似乎(至少在默认情况下)只做字符串插值和引用,而不做实际的参数化查询:

    if args is not None:
        query = query % db.literal(args)
    

    如果这不是字符串插值,那是什么?

    在ExecuteMany的情况下,它实际上尝试将insert/replace作为单个语句执行,而不是在循环中执行。这就是问题所在,似乎没有什么魔力。至少在它的默认行为中没有。

    编辑:哦,我刚刚意识到,模运算符可以被重写,但我觉得自己像是在欺骗和篡改源代码。没有找到覆盖项 mod 不过,在任何地方。

        4
  •  5
  •   user304386    14 年前

    如果只关心性能,那么使用AMIT建议的SQL接口就可以工作。但是,您将失去对SQL注入的保护,而本地Python对准备好的语句的支持可能会带来这种保护。python 3具有为PostgreSQL提供准备好的语句支持的模块。对于MySQL,“ourSQL”似乎提供了真正准备好的语句支持(不像在其他模块中那样伪造)。

        5
  •  5
  •   lbrandao    9 年前

    对于那些想弄清楚的人来说, 可以将准备好的语句与python和mysql一起使用。只需从mysql本身使用mysql connector/python并实例化右光标:

    https://dev.mysql.com/doc/connector-python/en/index.html

    https://dev.mysql.com/doc/connector-python/en/connector-python-api-mysqlcursorprepared.html

        6
  •  1
  •   Community Radu Dragan    7 年前

    不直接相关,但 this answer 在so的另一个问题中包含“模板化”查询的语法详细信息。我想说自动逃逸是他们最重要的特征…

    至于性能,请注意方法 executemany 在光标对象上。它将许多查询捆绑在一起并一次性执行它们,这是 带来更好的性能。

        7
  •  0
  •   whoopididoo    8 年前

    有一个解决办法!

    如果您将它们放入服务器上的存储过程中,并从python这样调用它们,就可以使用它们…

    cursor.callproc(Procedurename, args)
    

    下面是一个关于mysql和python中存储过程的很好的小教程。

    http://www.mysqltutorial.org/calling-mysql-stored-procedures-python/