Магія unicode у psycopg2

При написанні простенького веб-сервісу на Python/Django з доступом напряму до PostgreSQL, я зіткнувся з дивною поведінкою. Коли код запускався на тестовому сервері Django (manage.py runserver), psycopg2 вертав рядки як 'str' у кодуванні UTF-8. А коли запускався через WSGI під Apache2, то unicode. Я спочатку не вникав, чому так, але правити код на сервері після кожного оновлення, коли полізуть помилки, це не діло.

Маю підозру, що Django-вський сервер звертає увагу на # -*- coding: utf-8 -*-, тоді як mod_wsgi має це оголошення в носі, або навпаки.

Коли вже не знав що робити, як завжди допомогла документація. Там пишуть, що в Python 2 ви скоріш за все захочете завжди отримувати unicode. Так, я такий - хочу unicode. Для цього, одразу після імпорту psycopg2, задайте йому глобальні налаштування приведення типів, ось так:

import psycopg2

psycopg2.extensions.register_type(psycopg2.extensions.UNICODE)
psycopg2.extensions.register_type(psycopg2.extensions.UNICODEARRAY)

І не сушіть собі більше голову, у вас завжди буде unicode :)


PostgreSQL schema diff

Я з 2008-го року мріяв про інструмент який шукає різниці між схемами БД, а виявляється є такий. Зустрічайте - Another PostgreSQL Diff Tool (apgdiff)!

apgdiff є в репозиторіях Ubuntu. Дуже дивно як я його раніше не знайшов.


Іменування таблиць у базах даних

Стандартні рекомендації щодо іменування об'єктів БД застерігають від використання іменників у множині (наприклад, contracts замість contract). Але у вітчизняних (це я так завуальовано написав про "легасі" частину нашої БС) продуктах іноді зустрічаються назви у множині та ще й транслітеровані з української (наприклад, ugody замість contract). З такими назвами був цікавий казус: один з новачків з круглими від здивування очима спитав мене - що це за поле "угадано", хоча мався на увазі номер угоди "ugodano".

До чого я все це веду, ніколи не називайте об'єкти БД словами у множині і із застосуванням транслітерації, подивіться у словник і виберіть англійський відповідник слова, а якщо об'єкт і має якусь локальну специфіку, опишіть це в документації.