Velocity Reviews

Velocity Reviews (http://www.velocityreviews.com/forums/index.php)
-   Python (http://www.velocityreviews.com/forums/f43-python.html)
-   -   Can I make sqlite3 or shelve work reliably on any Win/Linux/Mac? (http://www.velocityreviews.com/forums/t715756-can-i-make-sqlite3-or-shelve-work-reliably-on-any-win-linux-mac.html)

Alex Quinn 02-22-2010 05:10 PM

Can I make sqlite3 or shelve work reliably on any Win/Linux/Mac?
 
Is there a way to have some kind of database (i.e. sqlite3, bsddb, dbm, etc.) that works out of the box on any Win/Linux/Mac machine with Python 2.6+ or 3.x? It's okay if the file format is different between machines, but I want my script to work without having to install anything.

Problems with current modules:

* Shelve used to do this. Unfortunately, since bsddb was deprecated/removed from the standard distro and Windows doesn't have dbm or gdbm, the only remaining option on Windows is dumbdbm, which is discouraged in the docs.

* Sqlite3 should fill the void now. However, in my experience, nearly every Linux Python install I encounter has a broken sqlite3 module ("ImportError: No module named _sqlite3"). It's a well-documented issue, but it the solution generally requires root access, which I don't have on these servers.

Potential solutions:

* Could I somehow bundle with my project the _sqlite3.so file and/or whatever else it needs? Or is there an alternate sqlite3 module I could use as a fallback that would just interface with the sqlite3 executable on the machine (i.e. /usr/local/bin/sqlite3)?

* Is there a way to drop bsddb into my project so it works out of the gate (no install) on either Linux, Windows, or Mac?

If you have any ideas, I'd be most appreciative. My objective here is just to find a portable and reliable solution that I can use for small projects.

Thanks,
Alex
--
http://alexquinn.org





Brad Harms 02-23-2010 06:58 AM

Re: Can I make sqlite3 or shelve work reliably on anyWin/Linux/Mac?
 
On Mon, 22 Feb 2010 09:10:38 -0800, Alex Quinn wrote:

> Is there a way to have some kind of database (i.e. sqlite3, bsddb, dbm,
> etc.) that works out of the box on any Win/Linux/Mac machine with Python
> 2.6+ or 3.x? It's okay if the file format is different between machines,
> but I want my script to work without having to install anything.
>
> Problems with current modules:
>
> * Shelve used to do this. Unfortunately, since bsddb was
> deprecated/removed from the standard distro and Windows doesn't have dbm
> or gdbm, the only remaining option on Windows is dumbdbm, which is
> discouraged in the docs.
>
> * Sqlite3 should fill the void now. However, in my experience, nearly
> every Linux Python install I encounter has a broken sqlite3 module
> ("ImportError: No module named _sqlite3"). It's a well-documented issue,
> but it the solution generally requires root access, which I don't have
> on these servers.
>
> Potential solutions:
>
> * Could I somehow bundle with my project the _sqlite3.so file and/or
> whatever else it needs? Or is there an alternate sqlite3 module I could
> use as a fallback that would just interface with the sqlite3 executable
> on the machine (i.e. /usr/local/bin/sqlite3)?
>
> * Is there a way to drop bsddb into my project so it works out of the
> gate (no install) on either Linux, Windows, or Mac?
>
> If you have any ideas, I'd be most appreciative. My objective here is
> just to find a portable and reliable solution that I can use for small
> projects.
>
> Thanks,
> Alex


Hi,

I'm speaking with little experience here, but one thought I had is to try
compiling Pysqlite ( http://pypi.python.org/pypi/pysqlite/2.5.6 ) for
each of your target OS's, probably using GCC cross compilers for the
platforms you aren't compiling on, then sort of "splice" them together so
that _sqlite3 always points to the binary for the current OS.

This snippet might help you get started:

import sys

# Linux binary
if 'linux' in sys.platform.lower():
import _sqlite3_linux as _sqlite3

# Windows binary
elif 'win32' == sys.platform:
import _sqlite3_windows as _sqlite3

# Mac binary
elif 'darwin' == sys.platform:
import _sqlite3_mac as _sqlite3

sys.modules['_sqlite3'] = _sqlite3


I'm not exactly sure when you would run this code. It would have to be
sometime before you import the main sqlite3 module.

--
Brad Harms -- http://alphaios.net


All times are GMT. The time now is 11:13 AM.

Powered by vBulletin®. Copyright ©2000 - 2014, vBulletin Solutions, Inc.
SEO by vBSEO ©2010, Crawlability, Inc.