Как заставить модуль Python Msqldb использовать? вместо% s для параметров запроса? - PullRequest
3 голосов
/ 05 мая 2009

MySqlDb - фантастический модуль Python, но одна его часть невероятно раздражает. Параметры запроса выглядят так

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

тогда как везде в известной вселенной (oracle, sqlserver, access, sybase ...) они выглядят так

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

Это означает, что если вы хотите быть портативным, вы должны как-то переключиться между двумя обозначениями? и% s, что действительно раздражает. (Пожалуйста, не говорите мне использовать Слой ОРМ - я тебя задушу).

Возможно, вы можете убедить mysqldb использовать стандартный синтаксис, но я еще не заставил это работать. Есть предложения?

Ответы [ 3 ]

2 голосов
/ 20 июля 2009

Из того, что я вижу, вы не можете использовать '?' для маркера параметра с MySQLdb (из коробки)

вы можете однако используйте именованные параметры

т.е.

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

будет эффективно выполняться 1=1

в mysql

но вроде как Эли ответил (но не хакерский)

вы могли бы вместо этого сделать:

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, чтобы создать его там, если вы хотите использовать обычное выполнение большую часть времени (временное переопределение))

... вы также можете изменить простую замену на что-то более правильное (при условии, что есть способ избежать знака вопроса), но это то, что я оставь до тебя :)

2 голосов
/ 05 мая 2009

Я нашел много информации о paramstyle, которая, по-видимому, подразумевала, что это может быть тем, что вы хотели, но согласно этой вики вы должны использовать paramstyle, который использует ваша библиотека, и большинство из них не позволяют изменить его:

paramstyle специфичен для используемой вами библиотеки и информационный - вы должны использовать ту, которую она использует. Это, наверное, самая раздражающая часть этого стандарта. (некоторые позволяют вам установить другое значение paramstyles, но это не стандартное поведение)

Я нашел несколько постов, в которых говорилось о том, что MySQLdb позволяет это, но, видимо, это не так, как кто-то указал, что у них это не работает.

1 голос
/ 05 мая 2009

Я не рекомендую делать это, но самое простое решение состоит в том, чтобы monkeypatch класс 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...