2010-11-12 11 views
1

Je suis à la recherche d'un moyen simple pour comparer les types de colonnes de SQLAlchemy aux types de base. Par exemple, si mon type de colonne est un VARCHAR de n'importe quelle longueur, je veux le lire comme une chaîne.Conversion facile entre les colonnes SQLAlchemy et les types de données?

Je peux lire le type de colonne okay, mais je ne suis pas sûr un moyen facile de vérifier son type de base ... ce serait bien si je pouvais utiliser quelque chose comme "if isinstance (mycolumn, int)" - mais Je suis nouveau sur python et je ne sais pas comment cela fonctionnerait.

Voici ce que j'ai jusqu'à présent:

from sqlalchemy import MetaData 
from sqlalchemy import create_engine, Column, Table 
engine = create_engine('mysql+mysqldb://user:[email protected]:3306/mydb', pool_recycle=3600) 
meta = MetaData() 
meta.bind = engine 
meta.reflect() 
datatable = meta.tables['my_data_table'] 
[c.type for c in datatable.columns] 

Sortie:

[INTEGER(display_width=11), DATE(), VARCHAR(length=127), DOUBLE(precision=None, scale=None, asdecimal=True)] 

Mon but final est double, d'abord parce que je veux formater la sortie en fonction du type lorsque je charge dans mon jQuery jqGrid. Deuxièmement, je convertis lentement des tableaux de données non normalisés en une structure normalisée, et je veux m'assurer que mes types restent cohérents - (pour m'assurer que mes nombres dans le tableau précédent sont stockés sous forme de nombres et non de chaînes ...)

Répondre

2

une solution consiste à faire la conversion manuellement - par exemple, cela fonctionne:

def convert(self, saType): 
    type = "Unknown" 
    if isinstance(saType,sqlalchemy.types.INTEGER): 
     type = "Integer" 
    elif isinstance(saType,sqlalchemy.types.VARCHAR): 
     type = "String" 
    elif isinstance(saType,sqlalchemy.types.DATE): 
     type = "Date" 
    elif isinstance(saType,sqlalchemy.dialects.mysql.base._FloatType): 
     type = "Double" 
    return type 

Je ne sais pas si cela est une façon python normale de faire les choses ... Je pense toujours comme un programmeur java.

+1

Merci Adam Morris, exactement ce qu'il cherchait. – csharpbd

1

Vous pouvez faire un str (column.type) cela vous donnera le type comme une chaîne. Dans votre code

from sqlalchemy import MetaData 
    from sqlalchemy import create_engine, Column, Table 
    engine = create_engine('mysql+mysqldb://user:[email protected]:3306/mydb', pool_recycle=3600) 
    meta = MetaData() 
    meta.bind = engine 
    meta.reflect() 
    datatable = meta.tables['my_data_table'] 
    [str(c.type) for c in datatable.columns] 

vous obtiendrez une liste des types.Hope de données que cela vous aide

1

Il suffit d'utiliser l'attribut python_type disponible dans tous les types AQLAlchemy, par exemple:

[c.type.python_type for c in datatable.columns]