#!/usr/bin/env python # encoding: utf-8 # # Copyright (c) 2010 Doug Hellmann. All rights reserved. # """Defining a custom type. """ #end_pymotw_header import sqlite3 try: import cPickle as pickle except: import pickle db_filename = 'todo.db' def adapter_func(obj): """Convert from in-memory to storage representation. """ print 'adapter_func(%s)\n' % obj return pickle.dumps(obj) def converter_func(data): """Convert from storage to in-memory representation. """ print 'converter_func(%r)\n' % data return pickle.loads(data) class MyObj(object): def __init__(self, arg): self.arg = arg def __str__(self): return 'MyObj(%r)' % self.arg # Register the functions for manipulating the type. sqlite3.register_adapter(MyObj, adapter_func) sqlite3.register_converter("MyObj", converter_func) # Create some objects to save. Use a list of tuples so we can pass # this sequence directly to executemany(). to_save = [ (MyObj('this is a value to save'),), (MyObj(42),), ] with sqlite3.connect(db_filename, detect_types=sqlite3.PARSE_COLNAMES) as conn: # Create a table with column of type "MyObj" conn.execute(""" create table if not exists obj2 ( id integer primary key autoincrement not null, data text ) """) cursor = conn.cursor() # Insert the objects into the database cursor.executemany("insert into obj2 (data) values (?)", to_save) # Query the database for the objects just saved cursor.execute('select id, data as "pickle [MyObj]" from obj2') for obj_id, obj in cursor.fetchall(): print 'Retrieved', obj_id, obj, type(obj) print