> I guess there is nothing at the database level.
Although not safe (as the user can reset this parameter), you could set
default_transaction_read_only for the application user.
postgres=# ALTER USER jdoe IN DATABASE postgres SET default_transaction_read_only TO true;
ALTER ROLE
postgres=# \c postgres jdoe
You are now connected to database "postgres" as user "jdoe".
postgres=> CREATE TABLE t1(i int);
ERROR: cannot execute CREATE TABLE in a read-only transaction
regards,
Feike