SQLAlchemy: Converta o valor da coluna e para trás entre o formato interno e o banco de dados
No meu banco de dados, tenho algumas colunas onde os dados são armazenados em algum formato estranho. Como o banco de dados também é usado por outro código, não posso alterar o formato dos dados.
Por exemplo, um dos formatos estranhos é que um valor de tempo é representado como uma sequência como23:42:30
. Eu gostaria de ter um pouco de magia que me permita usar sempredatetime.time
objetos no lado python.
Uma solução muito simples seria algo como:
col_raw = Column('col', String(7))
@property
def col(self):
return datetime.strptime(self.col_raw, '%H:%M:%S').time()
@col.setter
def colself, t):
self.col_raw = t.strftime('%H:%M:%S')
No entanto, isso apenas resolve o problema de leitura e gravação de dados. Coisas como essa não seriam possíveis:
Table.query.filter(Table.col == time(23,42,30))
Outra maneira seria usar oextensão híbrida. Dessa forma, a consulta seria possível, mas se eu a vir corretamente, a escrita não. Além disso, requer a codificação de tudo duas vezes, uma vez no código python e outra no código SQL. (Problema adicional: não tenho certeza se a conversão pode ser gravada usando apenas o código SQL.)
Não existe realmente nenhuma maneira de combinar os dois? Como eu defino duas funções, digamospython2sql
esql2python
, que SQLAlchemy usa para converter transparentemente os valores do objeto python em string e vice-versa? Eu sei que isso tornaria algumas consultas impossíveis, comobetween
oulike
ou somas e afins, mas tudo bem.
Lembre-se de que a hora é apenas um exemplo dos casos em que preciso converter dados; por isso, tente manter as respostas genéricas.