From: Richard Jones <rich@annexia.org>
To: caml-list@inria.fr
Subject: Idea for another type safe PostgreSQL interface
Date: Mon, 18 Jul 2005 22:05:19 +0100 [thread overview]
Message-ID: <20050718210518.GA10051@furbychan.cocan.org> (raw)
[I just throwing this idea out there to see if people find it
interesting, or want to shoot it down ... There're only fragments of
working code at the moment]
I'm thinking about a type safe interface to PostgreSQL. One such
interface at the moment is in Xcaml, but it only supports a very small
subset of SQL, and I like to use complex SQL. It seems that there is
a way to support the whole of PostgreSQL's language from within OCaml
programs, in a type safe way.
The general plan would be to have a camlp4 extension which would use
Postgres's new "PREPARE" feature to actually prepare the statements,
and Postgres's other new feature, "Describe Statement", to pull out
the parameter types and result types from the prepared statement.
This allows the camlp4 extension to replace the statement string with
a type safe expression, and allow type inference to find mismatches.
How a typical program would look is shown at the end of this message.
The advantages are:
* Complete support for PostgreSQL statements with hardly any
programming effort.
* Type safe.
* Schema is stored in one place - the database - and doesn't need
to be duplicated.
The obvious disadvantages stem from the fact that at _compile time_,
you need to have access to the database. Perhaps others will think of
other disadvantages.
(I currently don't care about databases which aren't Postgres ...)
Thoughts?
Rich.
----------------------------------------------------------------------
open Printf
open Postgresql_typed
(*
create temporary test (
id serial not null primary key,
str text not null,
num int4 not null
)
*)
let () =
let dbh = new Postgresql.connection ~dbname:"rich" in
let insert t i =
PGSQL(dbh) "insert into test (str, num) values ($t, $i)"
in
insert "hello" 10;
insert "world" 20;
let rows = PGSQL(dbh) "select id, str, num from test order by 3, 2, 1" in
(* 'rows' would have a type like (int, string, int) Rows.t *)
Rows.iter (
fun (id, text, num) ->
printf "id = %ld, text = %s, num = %ld\n" id text num
) rows
--
Richard Jones, CTO Merjis Ltd.
Merjis - web marketing and technology - http://merjis.com
Team Notepad - intranets and extranets for business - http://team-notepad.com
next reply other threads:[~2005-07-18 20:56 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2005-07-18 21:05 Richard Jones [this message]
2005-07-19 6:26 ` [Caml-list] " Alex Baretta
2005-07-19 11:53 ` Richard Jones
2005-07-19 16:37 ` Alex Baretta
2005-07-19 11:55 ` jean-claude
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20050718210518.GA10051@furbychan.cocan.org \
--to=rich@annexia.org \
--cc=caml-list@inria.fr \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox