在Python中构建MySQL更新查询的有效方法

时间:2010-04-30 16:52:10

标签: python mysql pylons

我有一个名为attributes的类变量,它列出了我想在数据库中更新的实例变量:

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 个答案:

答案 0 :(得分:3)

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游标都需要更新(我不知道你想用什么WHERE条件来识别要更新的特定记录,这就是为什么我在那里放了一个whatreveryouwanthere占位符; - )。

答案 1 :(得分:0)

第一个问题:是否会使用属性中的所有变量?如果是这样,最简单的方法可能就是使用DBAPI的execute方法。

假设您的光标被实例化为csr:

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

还有其他方法可以实现,例如使用词典,位置指示器等。有关详细信息,请参阅DBAPI FAQ