11 января 2013 г.

Приведение строки к любому типу в PostgreSQL

Для приведения строки к нужному типу в postgres достаточно после строкового литерала поставить два двоеточия и указать тип данных, к которому следует привести строку. Примеры:
'123'::integer
'2013-01-11'::timestamp
Это очень полезное свойство можно использовать при динамической генерации условий запроса совместно с параметризованными запросами jdbc. А в качестве значений параметров для унификации всегда хранить только строки.

Приведу код на java в качестве иллюстрации этого подхода.
// здесь указан запрос на выборку из БД всех записей
// (то есть не задано никаких дополнительных условий)
StringBuilder whereExpressionBuilder = new StringBuilder("select * from messages m");
// обработка условий, заданных пользователем
if (fromDate != null && !fromDate.isEmpty()) {
   whereExpressionBuilder.append(" where m.created >= ?::timestamp ");
}
PreparedStatement ps = connection.prepareStatement(whereExpressionBuilder.toString());
ps.setString(1, fromDate);

Объект fromDate - это обычная строка, которая приходит от клиента, например, из браузера. В этой строке содержится дата в текстовом представлении. Нам нужно к исходному sql-запросу добавить соответствующее условие. Но чтобы избежать sql-инъекций, формируем параметризованный запрос (PreparedStatement). Вместо знака вопроса будет подставлено нужное нам значение. А в качестве этого значения устанавливаем строку fromDate.

Конечно, данный подход не идеален. Хотя бы потому что здесь приходится генерить запрос к БД вручную. Для подобных целей лучше использовать ORM (например, Hibernate). Но если использовать ORM не представляется возможным, то преобразование строки к нужному типу в postgres значительно облегчает эту задачу.

Настройка postgres для доступа по сети

Актуальная версия этой статьи находится на моём новом сайте devmark.ru

Для того, чтобы открыть доступ по локальной сети с других машин к БД, которая развёрнута на данной, нужно отредактировать два файла: postgresql.conf и pg_hba. Привожу пример для своей системы, на которой установлена Ubuntu 12.04 и postgresql 9.1.

В файле /etc/postgresql/9.1/main/postgresql.conf находим строку
listen_addresses = '*'
и раскомментируем её (убираем решётку в начале строки) или добавляем, если такой строки в этом файле нет. Данный параметр говорит о том, чтобы обрабатывать все сообщения, приходящие извне. В противном случае будут обрабатываться только локальные запросы.

Затем в файле /etc/postgresql/9.1/main/pg_hba.conf с правами администратора нужно указать, какие хосты имеют право подключаться к указанной БД и каким образом обеспечивается безопасность подключения.

В самом простом случае открываем доступ с любого компа в подсети 192.168.1.*:
host all all 192.168.1.0/24 md5
Безопасность обеспечивается хэш-функцией md5 от пароля.

Внимание! Все эти настройки могут быть только на тестовых стендах или компьютерах разработчиков. В целях безопасности, на промышленных системах доступ должен быть ограничен гораздо сильнее.