Mercurial > cpython-lru_cache-weakref
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 |
| 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() |
