Эффективный способ построить запрос на обновление MySQL в Python - PullRequest
1 голос
/ 30 апреля 2010

У меня есть переменная класса с именем attribute, в которой перечислены переменные экземпляра, которые я хочу обновить в базе данных:

attributes = ['id', 'first_name', 'last_name', 'name', 'name_url',
              'email', 'password', 'password_salt', 'picture_id']

Каждый из атрибутов класса обновляется при создании экземпляра.

Я бы хотел пройтись по каждому атрибуту и ​​построить запрос на обновление MySQL в виде:

UPDATE members SET id = self._id, first_name = self._first name ...

Спасибо.

Ответы [ 2 ]

3 голосов
/ 01 мая 2010
class Ic(object):
  attributes = ['id', 'first_name', 'last_name', 'name', 'name_url',
              'email', 'password', 'password_salt', 'picture_id']

  def __init__(self): ...

  # and other methods that set all the attributes on self

  def updater(self):
    sqlbase = 'UPDATE members SET %s WHERE whateveryouwanthere'
    setpieces = []
    values = []
    for atr in self.attributes:
      setpieces.append('%s = ?' % atr)
      values.append(getattr(self, atr, None))
    return sqlbase % ', '.join(setpieces), values

Вызывающий объект должен создать объект класса Ic, а затем выполнить

.
sql, values = theobj.updater()

и, наконец, вызовите mycursor.execute(sql, values) для любого курсора API БД, который он имеет для базы данных, которую необходимо обновить (я понятия не имею, ГДЕ условия, которые вы хотите использовать для идентификации отдельной записи для обновления, поэтому я и поставил whatreveryouwanthere заполнитель там; -).

0 голосов
/ 30 апреля 2010

Первый вопрос: будут ли использоваться все переменные в атрибутах? Если это так, то, вероятно, самый простой способ - использовать метод execute DBAPI.

при условии, что ваш курсор создан как csr:

sql="UPDATE mytable SET phone=? where username=?"
variables = ("a phone number","a username")
csr.execute(sql,variables)

Существуют дополнительные способы сделать это, такие как использование словарей, позиционных индикаторов и т. Д., См. FAQ по DBAPI для получения более подробной информации.

...