Tuesday, November 06 2012
PostgreSQL, Emacs, pgdevenv-el

Editing SQL

It's hard to read my blog yet not know I'm using Emacs. It really is a great tool and has a lot to compare to PostgreSQL in terms of extensibility, documentation quality and community. And there's even a native implementation of the PostgreSQL Protocol written in Emacs Lisp.

One of the things where Emacs really shines is that interactive development environment you get when working on some Emacs Lisp code. Evaluating an function as easy as a single key chord, and that will both compile in the function and load it in the running process. I can't tell you how many times I've been missing that ability when editing C code.

With PostgreSQL too we get a pretty interactive environment with the psql console application, or with pgAdmin. One feature from pgAdmin that I've often wished I had in psql is the ability to edit my query online and easily run it in the console, rather than either using the readline limited history editing features or launching a new editor process each time with \e. At the same time I would much prefer using my usual Emacs editor to actually edit the query.

If you've been reading that blog before you know what to expect. My solution to the stated problem is available in pgdevenv-el, an Emacs package aimed at helping PostgreSQL developers. Most of the features in there are geared toward the core backend developers, except for this one I want to talk about today (I'll blog about the other ones too I guess).

What you can see from that screenshot is that the selected query text has been sent to the psql buffer and exectuted over there. And that the psql buffer is echoing all queries sent to it. What you can not see straight from that picture is the interaction to get there. Well, I've been implementing some elisp features that I was missing.

First, movement: you can do C-M-a and C-M-e to navigate to the beginning and the end of the SQL query at point, like you do in C or in lisp in Emacs.

Then, selection: you can do C-M-h to select the SQL query at point, you don't have to navigate yourself, pgdev-sql-mode knows how to do that. Side note, pgdev-sql-mode is the name of the minor mode you need to activate in your SQL buffers to have the magic available.

Last but not least, evaluation: as when editing lisp code, you can now use C-M-x to send the current query text to an associated psql buffer.

The way to associate the psql buffer to an SQL buffer is currently done thanks to the other pgdevenv-el features that this blog post is not talking about, and the setup is addressed in the documentation: you have to let know pgdevenv-el where your PostgreSQL branches are installed locally so that it can prepare you a Shell buffer with PGDATA and PGPORT already set for you. And currently, for C-M-x to work you need to open the buffer yourself before hand, using C-c - n (to run the command pgdev-open-shell), and type psql in the Shell prompt.

What that means for me is that I can at least edit SQL (in PostgreSQL regression files and other places) in my usual Emacs buffer and actually refine it as I go until it does exactly what I need, without having to use the readline history editing or the \e command, which is not great when your Shell is in already running inside Emacs.