#!/usr/bin/env python # encoding: utf-8 # # Copyright (c) 2010 Doug Hellmann. All rights reserved. # """Sorting a custom type. """ #end_pymotw_header import sqlite3 try: import cPickle as pickle except: import pickle db_filename = 'todo.db' def adapter_func(obj): return pickle.dumps(obj) def converter_func(data): return pickle.loads(data) class MyObj(object): def __init__(self, arg): self.arg = arg def __str__(self): return 'MyObj(%r)' % self.arg def __cmp__(self, other): return cmp(self.arg, other.arg) # Register the functions for manipulating the type. sqlite3.register_adapter(MyObj, adapter_func) sqlite3.register_converter("MyObj", converter_func) def collation_func(a, b): a_obj = converter_func(a) b_obj = converter_func(b) print 'collation_func(%s, %s)' % (a_obj, b_obj) return cmp(a_obj, b_obj) with sqlite3.connect(db_filename, detect_types=sqlite3.PARSE_DECLTYPES) as conn: # Define the collation conn.create_collation('unpickle', collation_func) # Clear the table and insert new values conn.execute('delete from obj') conn.executemany('insert into obj (data) values (?)', [(MyObj(x),) for x in xrange(5, 0, -1)], ) # Query the database for the objects just saved print '\nQuerying:' cursor = conn.cursor() cursor.execute("select id, data from obj order by data collate unpickle") for obj_id, obj in cursor.fetchall(): print obj_id, obj print