annotate Doc/includes/dbpickle.py @ 78069:a8aa77458e12 3.2

Add c_size_t and c_ssize_t to the ctypes summary table.
author Antoine Pitrou <solipsis@pitrou.net>
date Thu, 12 Jul 2012 20:31:50 +0200
parents 5e93c5cdc378
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
49549
e8841c346651 Improve pickle's documentation.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
diff changeset
1 # Simple example presenting how persistent ID can be used to pickle
e8841c346651 Improve pickle's documentation.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
diff changeset
2 # external objects by reference.
e8841c346651 Improve pickle's documentation.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
diff changeset
3
e8841c346651 Improve pickle's documentation.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
diff changeset
4 import pickle
e8841c346651 Improve pickle's documentation.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
diff changeset
5 import sqlite3
e8841c346651 Improve pickle's documentation.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
diff changeset
6 from collections import namedtuple
e8841c346651 Improve pickle's documentation.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
diff changeset
7
e8841c346651 Improve pickle's documentation.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
diff changeset
8 # Simple class representing a record in our database.
e8841c346651 Improve pickle's documentation.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
diff changeset
9 MemoRecord = namedtuple("MemoRecord", "key, task")
e8841c346651 Improve pickle's documentation.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
diff changeset
10
e8841c346651 Improve pickle's documentation.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
diff changeset
11 class DBPickler(pickle.Pickler):
e8841c346651 Improve pickle's documentation.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
diff changeset
12
e8841c346651 Improve pickle's documentation.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
diff changeset
13 def persistent_id(self, obj):
e8841c346651 Improve pickle's documentation.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
diff changeset
14 # Instead of pickling MemoRecord as a regular class instance, we emit a
49588
4a74590f38da Fix a grammar mistake in a comment.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 49579
diff changeset
15 # persistent ID.
49549
e8841c346651 Improve pickle's documentation.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
diff changeset
16 if isinstance(obj, MemoRecord):
49588
4a74590f38da Fix a grammar mistake in a comment.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 49579
diff changeset
17 # Here, our persistent ID is simply a tuple, containing a tag and a
4a74590f38da Fix a grammar mistake in a comment.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 49579
diff changeset
18 # key, which refers to a specific record in the database.
49549
e8841c346651 Improve pickle's documentation.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
diff changeset
19 return ("MemoRecord", obj.key)
e8841c346651 Improve pickle's documentation.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
diff changeset
20 else:
e8841c346651 Improve pickle's documentation.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
diff changeset
21 # If obj does not have a persistent ID, return None. This means obj
e8841c346651 Improve pickle's documentation.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
diff changeset
22 # needs to be pickled as usual.
e8841c346651 Improve pickle's documentation.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
diff changeset
23 return None
e8841c346651 Improve pickle's documentation.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
diff changeset
24
e8841c346651 Improve pickle's documentation.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
diff changeset
25
e8841c346651 Improve pickle's documentation.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
diff changeset
26 class DBUnpickler(pickle.Unpickler):
e8841c346651 Improve pickle's documentation.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
diff changeset
27
e8841c346651 Improve pickle's documentation.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
diff changeset
28 def __init__(self, file, connection):
e8841c346651 Improve pickle's documentation.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
diff changeset
29 super().__init__(file)
e8841c346651 Improve pickle's documentation.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
diff changeset
30 self.connection = connection
e8841c346651 Improve pickle's documentation.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
diff changeset
31
e8841c346651 Improve pickle's documentation.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
diff changeset
32 def persistent_load(self, pid):
e8841c346651 Improve pickle's documentation.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
diff changeset
33 # This method is invoked whenever a persistent ID is encountered.
e8841c346651 Improve pickle's documentation.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
diff changeset
34 # Here, pid is the tuple returned by DBPickler.
e8841c346651 Improve pickle's documentation.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
diff changeset
35 cursor = self.connection.cursor()
e8841c346651 Improve pickle's documentation.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
diff changeset
36 type_tag, key_id = pid
e8841c346651 Improve pickle's documentation.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
diff changeset
37 if type_tag == "MemoRecord":
e8841c346651 Improve pickle's documentation.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
diff changeset
38 # Fetch the referenced record from the database and return it.
e8841c346651 Improve pickle's documentation.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
diff changeset
39 cursor.execute("SELECT * FROM memos WHERE key=?", (str(key_id),))
e8841c346651 Improve pickle's documentation.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
diff changeset
40 key, task = cursor.fetchone()
e8841c346651 Improve pickle's documentation.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
diff changeset
41 return MemoRecord(key, task)
e8841c346651 Improve pickle's documentation.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
diff changeset
42 else:
e8841c346651 Improve pickle's documentation.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
diff changeset
43 # Always raises an error if you cannot return the correct object.
e8841c346651 Improve pickle's documentation.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
diff changeset
44 # Otherwise, the unpickler will think None is the object referenced
e8841c346651 Improve pickle's documentation.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
diff changeset
45 # by the persistent ID.
e8841c346651 Improve pickle's documentation.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
diff changeset
46 raise pickle.UnpicklingError("unsupported persistent object")
e8841c346651 Improve pickle's documentation.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
diff changeset
47
e8841c346651 Improve pickle's documentation.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
diff changeset
48
49579
0bc2cd2d9598 More improvements to pickle's documentation.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 49549
diff changeset
49 def main():
69581
5e93c5cdc378 Issue 11929: Minor whitespace clean-ups.
Raymond Hettinger <python@rcn.com>
parents: 49588
diff changeset
50 import io
5e93c5cdc378 Issue 11929: Minor whitespace clean-ups.
Raymond Hettinger <python@rcn.com>
parents: 49588
diff changeset
51 import pprint
49549
e8841c346651 Improve pickle's documentation.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
diff changeset
52
e8841c346651 Improve pickle's documentation.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
diff changeset
53 # Initialize and populate our database.
e8841c346651 Improve pickle's documentation.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
diff changeset
54 conn = sqlite3.connect(":memory:")
e8841c346651 Improve pickle's documentation.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
diff changeset
55 cursor = conn.cursor()
e8841c346651 Improve pickle's documentation.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
diff changeset
56 cursor.execute("CREATE TABLE memos(key INTEGER PRIMARY KEY, task TEXT)")
e8841c346651 Improve pickle's documentation.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
diff changeset
57 tasks = (
e8841c346651 Improve pickle's documentation.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
diff changeset
58 'give food to fish',
e8841c346651 Improve pickle's documentation.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
diff changeset
59 'prepare group meeting',
e8841c346651 Improve pickle's documentation.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
diff changeset
60 'fight with a zebra',
e8841c346651 Improve pickle's documentation.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
diff changeset
61 )
e8841c346651 Improve pickle's documentation.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
diff changeset
62 for task in tasks:
e8841c346651 Improve pickle's documentation.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
diff changeset
63 cursor.execute("INSERT INTO memos VALUES(NULL, ?)", (task,))
e8841c346651 Improve pickle's documentation.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
diff changeset
64
e8841c346651 Improve pickle's documentation.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
diff changeset
65 # Fetch the records to be pickled.
e8841c346651 Improve pickle's documentation.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
diff changeset
66 cursor.execute("SELECT * FROM memos")
e8841c346651 Improve pickle's documentation.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
diff changeset
67 memos = [MemoRecord(key, task) for key, task in cursor]
e8841c346651 Improve pickle's documentation.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
diff changeset
68 # Save the records using our custom DBPickler.
e8841c346651 Improve pickle's documentation.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
diff changeset
69 file = io.BytesIO()
e8841c346651 Improve pickle's documentation.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
diff changeset
70 DBPickler(file).dump(memos)
e8841c346651 Improve pickle's documentation.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
diff changeset
71
49579
0bc2cd2d9598 More improvements to pickle's documentation.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 49549
diff changeset
72 print("Pickled records:")
0bc2cd2d9598 More improvements to pickle's documentation.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 49549
diff changeset
73 pprint.pprint(memos)
49549
e8841c346651 Improve pickle's documentation.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
diff changeset
74
e8841c346651 Improve pickle's documentation.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
diff changeset
75 # Update a record, just for good measure.
e8841c346651 Improve pickle's documentation.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
diff changeset
76 cursor.execute("UPDATE memos SET task='learn italian' WHERE key=1")
e8841c346651 Improve pickle's documentation.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
diff changeset
77
49579
0bc2cd2d9598 More improvements to pickle's documentation.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 49549
diff changeset
78 # Load the records from the pickle data stream.
49549
e8841c346651 Improve pickle's documentation.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
diff changeset
79 file.seek(0)
e8841c346651 Improve pickle's documentation.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
diff changeset
80 memos = DBUnpickler(file, conn).load()
e8841c346651 Improve pickle's documentation.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
diff changeset
81
49579
0bc2cd2d9598 More improvements to pickle's documentation.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 49549
diff changeset
82 print("Unpickled records:")
0bc2cd2d9598 More improvements to pickle's documentation.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 49549
diff changeset
83 pprint.pprint(memos)
49549
e8841c346651 Improve pickle's documentation.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
diff changeset
84
e8841c346651 Improve pickle's documentation.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
diff changeset
85
e8841c346651 Improve pickle's documentation.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
diff changeset
86 if __name__ == '__main__':
e8841c346651 Improve pickle's documentation.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
diff changeset
87 main()