[pybsddb] Cursor form of pget() for secondary indicies with duplicates?

Will Weisser teetee at gmail.com
Wed Dec 3 19:41:14 CET 2008


DB_FIRST moves the cursor to the first entry in the database.  It looks like
you want to do cur.pget('letter', db.DB_SET).


On Tue, Dec 2, 2008 at 12:46 PM, denis.papathanasiou at gmail.com <
denis.papathanasiou at gmail.com> wrote:

> I've got a simple hash saved as a Berkeley DB file.
>
> The keys are: ['a', 'b', '0', 'c', '1', 'd', '2'] and the values are:
> ['letter', 'letter', 'number', 'letter', 'number', 'letter', 'number'].
>
> I created the db with a secondary index, so that I can lookup by value,
> e.g. call pget('letter') and get a list of ['a', 'b', 'c', 'd'] as the
> result.
>
> Except, it doesn't work; in that example, pget('letter') returns just 'a'.
>
> Then I read in the Oracle docs that secondary indices with duplicates
> need to use the cursor form of pget().
>
> But when I tried that, I got back the entire db.
>
> Any suggestions?
>
> Or are there examples of using the cursor form of pget() in bsddb3 I
> could look at?
>
> Here's my code:
>
> from bsddb3 import db
>
> pdb_object = db.DB()
> pdb_object.open("alphanumeric.db", None, db.DB_BTREE, db.DB_CREATE)
> sdb_object = db.DB()
> sdb_object.set_flags(db.DB_DUP | db.DB_DUPSORT)
> sdb_object.open("alphanumeric_secondary.db", None, db.DB_BTREE,
> db.DB_CREATE)
> pdb_object.associate(sdb_object, (lambda primary_key, primary_data:
> primary_data))
>
> pdb_object['a'] = 'letter'
> pdb_object['b'] = 'letter'
> pdb_object['0'] = 'number'
> pdb_object['c'] = 'letter'
> pdb_object['1'] = 'number'
> pdb_object['d'] = 'letter'
> pdb_object['2'] = 'number'
>
> # call pget():
>
> >>> sdb_object.pget('letter')
> ('a', 'letter')
> # returns just one value, not all of them...
>
>
> # call pget() with a cursor:
>
> cur = sdb_object.cursor()
> rec = cur.pget('letter', db.DB_FIRST)
> >>> rec
> ('letter', 'a', 'letter')
> # so far so good...
>
> >>> while rec:
> ...   rec = cur.pget('letter', db.DB_NEXT)
> ...   rec
> ...
> ('letter', 'b', 'letter')
> ('letter', 'c', 'letter')
> ('letter', 'd', 'letter')
> ('number', '0', 'number')
> ('number', '1', 'number')
> ('number', '2', 'number')
>
> # why were 'number' types returned? It looks like the pget() key was
> ignored...
>
> _______________________________________________
> pybsddb mailing list
> pybsddb at argo.es
> http://mailman.argo.es/listinfo/pybsddb
> http://www.argo.es/~jcea/programacion/pybsddb.htm
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mailman.jcea.es/pipermail/pybsddb/attachments/20081203/f281c700/attachment.htm>


More information about the pybsddb mailing list