How to silence PostgreSQL in Rails

Using PostgreSQL for your Rails applications is great, but it tends to be terribly chatty, spewing notices and internal queries all over your terminal and log files.

Luckily, there are a few simple steps to make PostgreSQL a bit more bearable to work with.

Notices when running tests

The most obvious noise from PostgreSQL is when running your tests. For a large’ish application a simple rake will cause pages of

NOTICE:  CREATE TABLE will create implicit sequence "inboxes_id_seq" for serial column "inboxes.id"
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "inboxes_pkey" for table "inboxes"

to be output.

To get rid of those, simply add

min_messages: warning

to your database.yml test environment (ActiveRecord documentation, PostgreSQL documentation).

ActiveRecord attribute queries

The first time Rails (well, ActiveRecord) loads a model it fetches the columns/attributes from the table. This is fine, but it can leave a lot of pointless and quite verbose output in your log files:

Inbox Load (3.7ms)  SELECT "inboxes".* FROM "inboxes" ORDER BY created_at LIMIT 1
  SQL (0.9ms)   SELECT a.attname, format_type(a.atttypid, a.atttypmod), d.adsrc, a.attnotnull
 FROM pg_attribute a LEFT JOIN pg_attrdef d
 ON a.attrelid = d.adrelid AND a.attnum = d.adnum
 WHERE a.attrelid = '"inboxes"'::regclass
 AND a.attnum > 0 AND NOT a.attisdropped
 ORDER BY a.attnum

Getting rid of those is as simple as installing the silent-postgres gem, which

“Silences internal diagnostic messages from postgresql connection adapter.”

Ah, silence is golden…