2012-02-03 42 views
5

我使用SQLAlchemy的配方here奇蹟般地JSON編碼/在我的模型解碼從DB列,如:SQLAlchemy的列同義詞與不同類型的

class Thing(Base): 
    __tablename__ = 'things' 
    id = Column(Integer(), primary_key=True) 
    data = Column(JSONEncodedDict) 

我碰釘子的時候我想創造一個在我的模型額外的「raw_data」字段訪問相同的底層JSON數據,但沒有編碼/解碼它:

raw_data = Column("data", VARCHAR) 

SQLAlchemy中似乎得到由名稱衝突困惑,並留下一列未映射。有什麼方法可以說服SQLAlchemy實際將兩個屬性映射到同一列?

回答

3

我只是通過SQLAlchemy定義raw_data列,然後使用Python的屬性/設置器來透明地使用data。 I.e .:

class Thing(Base): 
    __tablename__ = 'things' 
    id = Column(Integer(), primary_key=True) 
    raw_data = Column(String()) 

    @property 
    def data(self): 
     # add some checking here too 
     return json.loads(self.raw_data) 

    @data.setter 
    def data(self, value): 
     # dito 
     self.raw_data = json.dumps(value) 
+0

存在2個問題:1)它不能正確處理就地突變,2)對每個屬性訪問都解析JSON。 – 2012-02-03 12:01:41

+0

@Denis:就地變異跟蹤幾乎是正交的。我一直在修補它,並且比文檔中的示例暗示的更多:https://gist.github.com/1730610。 – 2012-02-03 15:29:46

+0

@DenisOtkidach,第二個問題很容易通過緩存來解決。這是過早的優化,所以我沒有立即包括它。我並沒有特別的SQLAlchemy經驗,但從我收集的這個解決方案並不罕見。 – 2012-02-04 04:53:33