Qual é a maneira mais eficiente de preencher atributos de classe com uma linha de uma consulta ao banco de dados?
Pergunta
Procurando que uma consulta ao banco de dados defina todas as variáveis de instância em uma classe:
Exemplo:
def populate(self, if):
#Perform mysql query
self._name = row['name']
self._email = row['email']
...
Qual é a maneira mais rápida de fazer isso?Ou isso não é recomendado (com uma abordagem melhor)?
Solução
Isso torna seu código mais legível e previsível para ser feito manualmente assim.Dessa forma, você sabe exatamente quais atributos existem e quais atributos não existem com muita facilidade.
Você pode usar
setattr
para automatizar toneladas deles.Uma maneira bastante interessante seria definir uma lista
attributes = ['name', 'email'...]
como um atributo de classe, então façafor name in self.attributes: setattr(self, "_" + name, row[name])
Você também pode obter os atributos da própria consulta, mas isso mudará dependendo da sua consulta (especialmente se você estiver usando
SELECT *
ou algo assim) e você está alterando seu banco de dados.Percebo que todos esses atributos têm sublinhado inicial.Se isso for algo puramente interno, considere se um atributo, em vez do resultado da consulta em si ou o armazenamento de um ditado, não atenderia melhor às suas necessidades.Geralmente, os atributos devem ser coisas bastante estáticas.
Ouvi dizer que oursql é melhor que MySQLdb
Outras dicas
Olhe para sqlalchemy é a abstração de banco de dados mais popular para python.
Se você realmente gosta do padrão de registro ativo, há uma camada que você pode colocar em cima dele chamada elixir.
Eu uso sqlalchemy porque é uma boa abstração de banco de dados e me permite trocar de banco de dados.Eu uso sqlite na memória para meus testes e posso inseri-lo em meu código usando sqlalchemy.