A simple, free SQL engine, completely self-contained. As far as I can tell, you instantiate it, read in a SQL file (consisting of plain SQL statements), and then query/update/insert against that SQL, and then output it to a file again when you are done. I hope there is an easy way to just point it at a file and be done with it, however.

See http://www.hwaci.com/sw/sqlite/ for more info.

Installing on Linux:

+ Download sqlite-2.8.15.tar.gz from http://www.sqlite.org/download.html (Note: I was unsuccessful getting PySQLite to build after installing sqlite-3.0.6. I think that it was a combination of things: sqlite3. instead of sqlite. mostly though.)

+ Execute the following shell commands:

tar -xzvf sqlite-2.8.15.tar.gz
cd sqlite
mkdir bld

+ Edit Makefile-linux.gcc and uncomment line 35, and comment line 36. The section should now look like:

#### If you want the SQLite library to be safe for use within a
#    multi-threaded program, then define the following macro
#    appropriately:
#
THREADSAFE = -DTHREADSAFE=1
#THREADSAFE = -DTHREADSAFE=0

+ Execute:

cd bld
../configure
make
sudo make install

+ Download PySQLite from http://pysqlite.sf.net and follow along:

tar -xzvf pysqlite-0.5.1.tar.gz
cd sqlite
python2.3 setup.py build
sudo python2.3 setup.py install
sudo /sbin/ldconfig

+ Start Python and make sure it imports:

[pmcnett@sol pmcnett]$ python
Python 2.3.2 (#1, Oct  6 2003, 10:07:16)
[GCC 3.2.2 20030222 (Red Hat Linux 3.2.2-5)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sqlite
>>> dir(sqlite)
[BINARY, Binary, Connection, Cursor, DATE, DBAPITypeObject, DataError, DatabaseError, Error, INT, IntegrityError, InterfaceError, InternalError, NUMBER, NotSupportedError, OperationalError, PgResultSet, ProgrammingError, ROWID, STRING, TIME, TIMESTAMP, UNICODESTRING, Warning, __all__, __builtins__, __doc__, __file__, __name__, __path__, __revision__, _sqlite, apilevel, connect, decode, encode, main, paramstyle, threadsafety, version, 'version_info']
>>>