sqlite-simple: mid-level bindings to the sqlite database
========================================================

This library is a mid-level Haskell binding to the SQLite database.

Sqlite-simple provides a convenient API to sqlite that does some level
of automatic data conversion between the database and Haskell types.
The API has been modeled directly after
[postgresql-simple](http://github.com/lpsmith/postgresql-simple) which
in turn borrows from
[mysql-simple](https://github.com/bos/mysql-simple).

The library has been fairly well unit tested.  It's also been benchmarked using
[db-bench](https://github.com/nurpax/db-bench) which is a performance comparison suite 
for measuring database access overhead when using the various Haskell database libraries.

[![Build Status](https://secure.travis-ci.org/nurpax/sqlite-simple.png)](http://travis-ci.org/nurpax/sqlite-simple)

Installation
------------

You can install [sqlite-simple from Hackage](http://hackage.haskell.org/package/sqlite-simple)
with:

```
cabal install sqlite-simple
```

A Windows user?  It works but please see [this note](https://gist.github.com/3907344) on direct-sqlite Windows installation.

Examples of use
---------------

Create a test database by copy&pasting the below snippet to your
shell:

```
sqlite3 test.db "CREATE TABLE test (id INTEGER PRIMARY KEY, str text);\
INSERT INTO test (str) VALUES ('test string');"
```

..and access it in Haskell:

```haskell
{-# LANGUAGE OverloadedStrings #-}
import Control.Applicative
import Database.SQLite.Simple
import Database.SQLite.Simple.FromRow

data TestField = TestField Int String deriving (Show)

instance FromRow TestField where
  fromRow = TestField <$> field <*> field

main :: IO ()
main = do
  conn <- open "test.db"
  execute conn "INSERT INTO test (str) VALUES (?)"
    (Only ("test string 2" :: String))
  r <- query_ conn "SELECT * from test" :: IO [TestField]
  mapM_ print r
  close conn
```

More simple usage examples can be found from [sqlite-simple unit
tests](https://github.com/nurpax/sqlite-simple/blob/master/test/Simple.hs).


Development
-----------

The development roadmap for sqlite-simple is mostly captured in the
github issue database.

I'm happy to receive bug reports, fixes, documentation enhancements,
and other improvements.

Please report bugs via the
[github issue tracker](http://github.com/nurpax/sqlite-simple/issues).

For general database issues with a Haskell focus, I recommend sending
e-mail to the [database-devel mailing
list](http://www.haskell.org/mailman/listinfo/database-devel).

### Contributing

If you send pull requests for new features, it'd be great if you could also develop unit 
tests for any such features.


Credits
-------

A lot of the code is directly borrowed from
[mysql-simple](http://github.com/bos/mysql-simple) by Bryan O'Sullivan
and from
[postgresql-simple](http://github.com/lpsmith/postgresql-simple) by
Leon P. Smith.  Like Leon in postgresql-simple, I borrow code and
documentation directly from both of these ancestor libraries.

This package builds on top of the
[direct-sqlite](http://hackage.haskell.org/package/direct-sqlite)
package by Irene Knapp.

SQLite is rather weakly-typed and thus the SQL to Haskell type
strictness of the parent projects does not necessarily apply to this
package.