2009-09-04 10 views
21

में पाइथन डिक्ट्स मैं अपने एसक्लाइट डीबी से/एक धक्का को लोड/सहेजना चाहता हूं, लेकिन इसमें कुछ समस्याएं हैं जो इसे करने का एक आसान तरीका है। मुझे वास्तव में सामग्री के आधार पर फ़िल्टर करने में सक्षम होने की आवश्यकता नहीं है, इसलिए स्ट्रिंग से/से एक सरल रूपांतरण ठीक है।स्क्लेल्चेमी

अगली सबसे अच्छी बात विदेशी कुंजी होगी। कृपया बड़े उदाहरणों के लिंक पोस्ट न करें, अगर मैं कभी भी उन पर नजर रखता हूं तो मेरा सिर विस्फोट कर देगा।

उत्तर

4

आप sqlalchemy.types.TypeDecorator उपवर्गीकरण क्रमबद्धता और पाठ अक्रमांकन को संभालने के लिए एक कस्टम प्रकार बना सकते हैं।

कार्यान्वयन

import json 
import sqlalchemy 
from sqlalchemy.types import TypeDecorator 

SIZE = 256 

class TextPickleType(TypeDecorator): 

    impl = sqlalchemy.Text(SIZE) 

    def process_bind_param(self, value, dialect): 
     if value is not None: 
      value = json.dumps(value) 

     return value 

    def process_result_value(self, value, dialect): 
     if value is not None: 
      value = json.loads(value) 
     return value 

उदाहरण उपयोग प्रकार दिखाई देंगे:

class SomeModel(Base): 
    __tablename__ = 'the_table' 
    id = Column(Integer, primary_key=True) 
    json_field = Column(TextPickleType()) 

s = SomeEntity(json_field={'baked': 'beans', 'spam': 'ham'}) 
session.add(s) 
session.commit() 

यह an example in the SQLAlchemy docs में उल्लिखित है, जो भी पता चलता है कि शब्दकोश के उत्परिवर्तन के ट्रैक करने के लिए कैसे।

यह दृष्टिकोण केवल PickleType की pickler तर्क को मान के रूप में json गुजर एक और जवाब पर उसकी टिप्पणी में सही ढंग से काम नहीं करेगा, AlexGrönholm points out के रूप में जबकि, पायथन के सभी संस्करणों के लिए काम करना चाहिए।

+0

आपका उत्तर पूरा नहीं हुआ है, इसलिए स्वीकार नहीं कर सकता। इसमें "स्वीकार्य उत्तर" का भी संदर्भ है जो किसी भी प्रयास को किसी भी प्रयास को बदलता है और किसी विशेष उत्तर को बदलता है। कृपया एक सही उत्तर के साथ शुरू करें, और (यदि आपको जरूरी है) तो अंत में दूसरों ने क्या गलत किया है। –

+0

@ जोनासबस्ट्रोम मेला पर्याप्त है, मैंने वर्तमान में स्वीकृत उत्तर के संदर्भ को हटा दिया है और उदाहरण को थोड़ा सा – karlson

+0

बढ़ाया है जब मैंने इसे पहली बार सेट अप किया था। हालांकि मेरे मॉडल में एक नया फ़ील्ड जोड़ने के बाद ('product_count = db.Column (db.Integer)') यह मुझे mysql में परिवर्तनों को माइग्रेट करते समय निम्न त्रुटि देता है: 'NameError: name 'TextPickleType' को परिभाषित नहीं किया गया है – iamlolz

3

आप एक 1-एन संबंध नक्शा और dict बल्कि तो list के रूप में यह नक्शा, तो Dictionary Based Collections

पढ़ लेकिन अगर आप एक क्षेत्र मतलब है, आप कर सकते हैं तो क्या यह एक है करने के लिए की जरूरत है प्रकार स्ट्रिंग के डीबी फ़ील्ड, जो आपके पायथन ऑब्जेक्ट में मैप किया गया है। लेकिन एक ही पायथन ऑब्जेक्ट पर आप एक ऐसी प्रॉपर्टी प्रदान करते हैं जो टाइप मैप() के इस मैप किए गए स्ट्रिंग फ़ील्ड के लिए प्रॉक्सी होगी। कोड उदाहरण (नहीं परीक्षण किया):

class MyObject(object): 
    # fields (mapped automatically by sqlalchemy using mapper(...) 
    MyFieldAsString = None 

    def _get_MyFieldAsDict(self): 
     if self.MyFieldAsString: 
      return eval(self.MyFieldAsString) 
     else: 
      return {} # be careful with None and empty dict 

    def _set_MyFieldAsDict(self, value): 
     if value: 
      self.MyFieldAsString = str(value) 
     else: 
      self.MyFieldAsString = None 

    MyFieldAsDict = property(_get_MyFieldAsDict, _set_MyFieldAsDict) 
+0

अहह! शानदार! :) –

+1

ध्यान दें कि SQLAlchemy आपको निर्देश की सामग्री को संशोधित नहीं करेगा, इसलिए सेट किए जाने के बाद आप किसी भी बदलाव में एक बदलाव कर सकते हैं। – Simon

48

SQLAlchemy PickleType वास्तव में इस के लिए है।

class SomeEntity(Base): 
    __tablename__ = 'some_entity' 
    id = Column(Integer, primary_key=True) 
    attributes = Column(PickleType) 

# Just set the attribute to save it 
s = SomeEntity(attributes={'baked': 'beans', 'spam': 'ham'}) 
session.add(s) 
session.commit() 

# If mutable=True on PickleType (the default) SQLAlchemy automatically 
# notices modifications. 
s.attributes['parrot'] = 'dead' 
session.commit() 

आप कुछ और है कि dumps() और loads() तरीकों के साथ पिकलर बाहर बदलकर क्रमबद्धता तंत्र बदल सकते हैं। PickleType उपवर्गीकरण और impl attritbute अधिभावी द्वारा अंतर्निहित भंडारण तंत्र:

class TextPickleType(PickleType): 
    impl = Text 

import json 
class SomeOtherEntity(Base): 
    __tablename__ = 'some_other_entity' 
    id = Column(Integer, primary_key=True) 
    attributes = Column(TextPickleType(pickler=json)) 
+0

+1: बहुत अच्छा वास्तव में – van

+0

लवली! मैं इसे पहली बात सोमवार को आजमाउंगा। –

+0

जब मैं self._properties [k] = v कोशिश करता हूं तो शायद मैं कुछ गंभीरता से गलत कर रहा हूं? मुझे "TypeError: 'कॉलम' ऑब्जेक्ट आइटम असाइनमेंट का समर्थन नहीं करता है"। –

संबंधित मुद्दे