2010-07-02 4 views
1

j'ai une valeur qui peut être entier, flottant ou chaîne, et j'ai créé différentes colonnes:un champ avec différents types de données [SQLAlchemy]

#declarative 
class MyClass(Base): 

    #id and other Columns 
    _value_str = Column(String(100)) 
    _value_int = Column(Integer) 
    _value_float = Column(Float) 

    def __init__(self,...,value): 
     self._value_str = value if isinstance(value,(str,unicode)) else None 
     self._value_int = value if isinstance(value,int) else None 
     self._value_float = value if isinstance(value,float) else None 

et je voudrais faire quelque chose comme ceci:

>>> value = 'text' 
>>> my_class = MyClass(value, ...) 
>>> my_class.value 
>>> 'text' 
>>> session.add(my_class) 
>>> session.commit() 
#specialy this 
>>> result = session.query(Myclass).filter(Myclass.value == 'text').one() 
>>> print result.value 
>>> 'text' 

Peut-être que j'ai un problème de conception, j'accepter une bonne idée

Je suis newbe dans SQLAlchemy

Merci

Répondre

2

Probablement un problème de conception - un peu d'incompatibilité entre votre DB et Python. Dans les variables SQL (colonnes) ont un type, alors que dans les valeurs python ont le type.

Une possibilité serait d'utiliser une seule colonne (une chaîne), mais décapez la valeur avant de la stocker.

Ceci peut être accompli automatiquement avec un sqlalchemy custom type.

Quelque chose le long des lignes de ce qui suit (utilise jsonpickle pour effectuer la conversion plutôt que cPickle):

import sqlalchemy.types as types 
import jsonpickle 
from copy import deepcopy 

class JsonType(types.MutableType, types.TypeDecorator):  
    impl = types.Unicode 

    def process_bind_param(self, value, engine): 
     return unicode(jsonpickle.encode(value)) 

    def process_result_value(self, value, engine): 
     if value: 
      rv = jsonpickle.decode(value) 
      return rv 
     else: 
      return None 

    def copy_value(self, value): 
     return deepcopy(value) 

    def compare_values(self, x, y): 
     return x == y 

Et puis utilisez comme suit:

class MyClass(base): 
    value = Column(JsonType()) 
+0

grille !!, je recherchais pour quelque chose comme ça, mais les documentations sont vraiment bast, merci – sacabuche

+0

regardez, pourrait vous intéresser, ceci est une option ussing MapperExtention http://stackoverflow.com/questions/3020394/sqlalchemy-how-to-map-against-a -read-only-or-calculé- propriété – sacabuche

+0

Notez avec cette réponse que vous ne pouvez pas utiliser les fonctions db, par ex. sum() sur tous les flottants ou ints que vous stockez. Les docs sont en fait assez bons avec SQLAlchemy - ils doivent couvrir beaucoup de terrain - mais oui, pourraient faire avec quelques autres exemples du monde réel. – EoghanM

Questions connexes