2010-07-02 39 views
1

我有,可以是整數,浮點數或字符串的值,並且我創建不同的列:一個字段與不同的數據類型[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 

和我想這樣做:

>>> 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' 

也許我有一個設計問題,我接受任何好主意

我newbe在SQLAlchemy的

謝謝

回答

2

可能是一個設計問題 - 你的數據庫和Python之間有點不匹配。在SQL變量(列)中有一個類型,而在python中有值類型。

一種可能性是使用單個列(一個字符串),但在存儲它之前醃製該值。

這可以通過sqlalchemy custom type自動完成。

大意如下的東西線(使用jsonpickle做轉換,而不是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 

然後按如下方式使用它:

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

篦!,我一直在尋找對於類似的東西,但文件是真的韌皮,謝謝 – sacabuche 2010-07-07 09:26:39

+0

看起來,可能會感興趣,這是一個選項使用MapperExtention http://stackoverflow.com/questions/3020394/sqlalchemy-how-to-map-against-a - 讀取 - 只或 - 計算─ property – sacabuche 2010-07-07 09:32:15

+0

注意這個答案,你不能使用db函數,例如sum()在你存儲的任何浮點數或整數。 SQLAlchemy的文檔實際上相當不錯 - 它們必須涵蓋大量的基礎 - 但是,可以在少數幾個真實世界的例子中使用。 – EoghanM 2010-07-07 09:49:24

相關問題