Python 用数据库查询中的一行填充类属性的最有效方法是什么?

Python 用数据库查询中的一行填充类属性的最有效方法是什么?,python,pylons,mysql,Python,Pylons,Mysql,希望数据库查询设置类中的所有实例变量: 例如: def populate(self, if): #Perform mysql query self._name = row['name'] self._email = row['email'] ... 最快的方法是什么?还是不建议(采用更好的方法)? 像这样手动操作,可以使您的代码最具可读性和可预测性。这样,您就可以准确地知道哪些属性存在,哪些属性不存在 您可以使用setattr来自动执行这些操作 一个相当好的方

希望数据库查询设置类中的所有实例变量:

例如:

def populate(self, if):
    #Perform mysql query

    self._name = row['name']
    self._email = row['email']
    ...
最快的方法是什么?还是不建议(采用更好的方法)?

  • 像这样手动操作,可以使您的代码最具可读性和可预测性。这样,您就可以准确地知道哪些属性存在,哪些属性不存在

  • 您可以使用
    setattr
    来自动执行这些操作

    一个相当好的方法是将列表
    attributes=['name','email'…]
    定义为类属性,然后执行以下操作

    for name in self.attributes:
        setattr(self, "_" + name, row[name])
    
    您也可以从查询本身获取属性,但这将根据您的查询(特别是如果您使用
    SELECT*
    或类似的方法)和您对数据库的更改而改变

  • 我注意到这些属性都有前导下划线。如果这是一个纯粹的内部问题,那么考虑一个属性而不是查询结果本身还是存储一个DICT并不能更好地满足您的需求。通常,属性应该是相当静态的东西

  • 我听说我们的SQL比MySQLdb更好

看看它是python最流行的数据库抽象。
如果你真的喜欢活动记录模式,有一层你可以放在上面,叫做


我使用sqlalchemy是因为它是一个很好的数据库抽象,允许我切换数据库。我在内存中使用sqlite进行测试,我可以使用sqlalchemy将其嵌入到代码中

谢谢,迈克。这很有帮助。关于查询结果本身的倒数第二点是什么意思?您的意思是设置一个“info”这样的实例变量,然后将整行设置为该值吗?row=db.getRow(query)self.\u info=row类似的东西?@ensnare,这正是我的意思。在这种情况下user.id和user.info.id之间出现差异会不会很奇怪?什么是更清洁的解决方案?谢谢你的帮助。你可能想也可能不想直接将所有其他内容设置为属性。如果你提出了一个新问题来解释你正在解决的问题,也许有人能帮助你确定你的课堂设计是最优的。谢谢你的回答。我曾经使用过sqlalchemy,但因为我对数据库的可移植性不感兴趣,所以对于我正在尝试做的事情来说,它似乎有点重。