Erlang MySQL driver
Erlang Perl
Latest commit 6f72bc7 Mar 22, 2011 @jkvor updating readme
Failed to load latest commit information.
ebin prexing modules with 'e' Sep 9, 2009
include adding old password support Oct 12, 2009
priv initial commit Sep 6, 2009
src fixing unicode bug Dec 14, 2009
t updating tests to not use parameterized modules Oct 7, 2009
.gitignore updating gitignore Oct 20, 2009
Makefile updating install target Sep 21, 2009
README.markdown updating readme Mar 21, 2011


This fork is no longer maintained. Active development has moved to:


Start the application


Add a pool

emysql:add_pool(PoolName, PoolSize, Username, Password, Host, Port, Database, Encoding) -> ok | {error, pool_already_exists}
PoolName = atom()
PoolSize = integer()
Username = string()
Password = string()
Host = string()
Port = integer()
Database = string()
Encoding = atom()

emysql:add_pool(mypoolname, 1, "username", "mypassword", "localhost", 3306, "mydatabase", utf8).

Record Types

-record(ok_packet, {seq_num, affected_rows, insert_id, status, warning_count, msg}).
-record(error_packet, {seq_num, code, msg}).
-record(result_packet, {seq_num, field_list, rows, extra}).

Executing SQL statements

emysql:execute(PoolName, Statement) -> result_packet() | ok_packet() | error_packet()
PoolName = atom()
Statement = string() | binary()

emysql:execute(mypoolname, <<"SELECT * from mytable">>).
#result_packet{field_list=[...], rows=[...]}

emysql:execute(mypoolname, <<"UPDATE mytable SET bar = 'baz' WHERE id = 1">>).

Executing prepared statements

emysql:prepare(StmtName, Statement) -> ok
StmtName = atom()
Statement = binary() | string()

emysql:prepare(my_stmt, <<"SELECT * from mytable WHERE id = ?">>).

emysql:execute(StmtName, Args) -> result_packet() | ok_packet() | error_packet()
StmtName = atom()
Args = [term()]

emysql:execute(my_stmt, [1]).
#result_packet{field_list=[...], rows=[...]}

Converting Row Data To Records

emysql_util:as_record(ResultPacket, RecordName, Fields) -> Result
ResultPacket = result_packet()
RecordName = atom() (the name of the record to generate)
Fields = atom()
Result = [record()]

-record(foo, {bar, baz, bat}).

fetch_foo() ->
   Result = emysql:execute(pool1, <<"select bar, baz, bat from foo">>),
   Recs = emysql_util:as_record(Result, foo, record_info(fields, foo)),
      io:format("foo: ~p, ~p, ~p~n", [, Foo#foo.baz, Foo#foo.bat])
    end || Foo <- Recs].


  • decrementing pool size could close sockets that are in use
  • spawn individual conn_mgr gen_server processes for each pool
  • allow row results to be returned as binary