One of the problems that I've had to solve is how to store lots of static data in a SQL database without adding more than 100 columns into a DB table. A good solution to this problem is to store this data with a pickled dictionary. The problem with that is the in-built PickleType defined by SQLAlchemy does not also base64 encode the result of the pickle operation on the dictionary (I wanted to do this because the custom field type I'd defined within the Django app was something similar to this, which assumes base64 encoded data coming in). However, fortunately, it's rather easy to create custom Type's for SQLAlchemy and use them in your models. Here is the custom type I created to store the data.
- import base64
- try:
- import cPickle as pickle
- except:
- import pickle
- class EncodedPickleType(types.TypeDecorator):
- """
- This class should be used whenever pickled data needs to be stored
- (instead of using the in-built PickleType). The reason for this is
- that the in-built type does not encode the pickled string using
- base64, which is what the Django field type expects.
- """
- impl = types.Text
- def process_bind_param(self, value, dialect):
- dumps = pickle.dumps
- if value is None:
- return None
- return base64.b64encode(dumps(value))
- def process_result_value(self, value, dialect):
- loads = pickle.loads
- if value is None:
- return None
- if not isinstance(value, basestring):
- return value
- return loads(base64.b64decode(value))
You can then use this within your model definitions and feed it a dictionary. The field will take care of pickling and encoding it as well as decoding and unpickling the data when accessing the data.
1 comment:
it would be helpful if you included the full example of your implementation w.r.t. flask and sqlalchemy as your post title suggests.
thanks
Post a Comment