2 votes

Tester le type des valeurs sélectionnées dans une base de données

Je travaille sur l'extraction de données à partir d'une base de données SQL Server avec un jeu de caractères latin_1 dans une base de données Greenplum/Postgres avec un jeu de caractères utf-8. J'essaie de convertir les valeurs de chaîne immédiatement avant l'insertion, mais lorsque je fais ceci :

row=[i.decode('latin_1') for i in row]
row=[i.encode('utf-8') for i in row]

Je reçois une erreur indiquant que décode n'est pas un membre du type int. Cela a du sens étant donné que des valeurs entières arrivent. Mais il y a aussi des chaînes de caractères. Dans d'autres publications de ce type que j'ai lues, la réponse a toujours été immédiatement et catégoriquement 'vous devriez toujours savoir quel type arrive'. À bien des égards, je le sais, puisque c'est une requête statique, mais il semble très maladroit, et honnêtement non maintenable, de définir un ensemble de valeurs pour i dans lequel je veux effectuer la conversion pour chaque requête que j'écris. Il semblerait que les tests de type seraient la réponse propre, encapsulable et réutilisable ici, non ?

Des suggestions ?

3voto

georg Points 52691

Je vais utiliser une petite fonction comme celle-ci:

def convert(s):
    try:
        return s.decode('latin-1').encode('utf8')
    except AttributeError:
        return s

et ensuite

row = map(convert, row) # ou une compréhension si vous préférez

L'avantage est qu'elle gère également automatiquement les types autres que int.

2voto

Burhan Khalid Points 50578

row = [i.decode('latin_1') if not isinstance(i,int) else i for i in row]

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X