This cost me some hair-pulling today as I was trying to write a custom test runner for a Django project I'm working on that creates a test Xapian database just for running the tests. Basically, you can't do this:


os.mkdir(database_file_path)

Because if you do you end up getting these strange DatabaseOpeningError exceptions. So, here's how you do it:


import xapian
xapian.WritableDatabase(database_file_path,
                        xapian.DB_CREATE_OR_OPEN)

Hopefully by blogging about this some other poor coder will save some time.

Comments

LE

Why would you mkdir a database's directory? Makes no sense.

Peter Bengtsson

Because the test runner doesn't work like a normal Django startup. Without first doing this, the first test that tries to open the database in read-only mode will fail. Perhaps there is a more appropriate way but I couldn't immediately find one.

david

I normally use xappy for xapian stuff, it makes it a lot easier, or at least I look at the source code if there is something that is bugging me. i.e http://code.google.com/p/xappy/source/browse/trunk/xappy/indexerconnection.py"

The makers of it also make xapian core, so xappy has got best use practices in it.

Peter Bengtsson

I'm currently using django-haystack to wrap Xapian. django-haystack actually wraps xapian-haystack.

I might reconsider this because I'm not getting the most out of django-haystack because so much of my work has been to patch and subclass django-haystack in various forms because I'm not using Django's ORM.

I will take a closer look at xappy as it might actually simplify the stack in this project.

kirby

Was going nuts because django didn't create it initially. Thanks!

Your email will never ever be published.

Related posts