August 28, 2009

Чистим дубликаты в таблице MySQL

Оптимизируя таблицы в довольно большой базе обнаружил что в одном месте небыло уникального индекса. Т.е. требовалось чтобы 2 поля вместе были уникальные. Добавляется он просто:
ALTER TABLE tablename ADD UNIQUE (`first_id`, `second_id`);
Проблема в моем случае стала ребром потому что были найдены неуникальные записи, чего и не должно было быть, и чего можно было ожидать. Гугл подсказал много разных решений. В основном они сводились к 2 решениям
  • созданию временной таблицы, переносу туда уникальных данных, удаление старой таблицы и переименование новой
  • писанине скрипта который все поправит
Я уже было и начал писать скрипт который все это поправил бы но вдруг нашел оптимальное решение:
ALTER IGNORE TABLE tablename ADD UNIQUE (`shared_feed_id`, `post_id`);
Добавляем всего одно поле и получаем то что надо. Теперь если при создании индекса встречаются неуникальные поля, они удаляются. Вот такое простое решение не совсем сложной задачи и кривых скриптов :) Happy coding !

August 24, 2009

Django QuerySet API - ограничение выборки по not equal

Продолжим с Django. В стандартном QuerySet API существует большое количество параметров выборки такие как EXACT, CONTAINS, IN, GT, GTE и т.д. Остальные и документацию, если еще кто-то из интересующихся темой не читал, можно прочитать по приведенным ссылкам.

Проблема встречается тогда, когда хочется найти NE что эквивалентно not equal, т.е. когда мы хотим сделать выборку записей в которых определенное поле "не равно" какому то значению. Дело в том что этого почему то нет в queryset api.

Немножко погуглив можно найти решение, а можно его подсмотреть прямо здесь :), причем есть вроде несколько вариантов в последних версиях Django (на момент написания это 1.1). А вот и пример решения задачи.
examples = ExampleModel.objects.filter(
~Q(user=request.user),
is_active=True
)

В результате этого мы получим примерно такой запрос (в моем случае на примере MySQL бекэнда):
SELECT `app_examplemodel`.`id`, `app_examplemodel`.`user_id`, `app_examplemodel`.`is_active` FROM `app_examplemodel` WHERE (NOT (`app_examplemodel`.`user_id` = 1 ) AND `publishers_sites`.`is_active` = True )

Happy coding! 

August 18, 2009

Ограниченый QuerySet для админ интерфейса Django

Django очень удобный и очень гибкий фреймворк для создания сайтов. Столкнувшись с задачей ограничения выборки для админ интерфейса я не поверил что этого нельзя сделать. На практике задача заключалась в том что мне нужно было показывать и давать возможность редактировать записи относящиеся только к группе в которой состоит текущий пользователь.

В документации по админу на официальном сайте Django ничего по этому поводу не сказано. Ну раз ничего в документации нет, значит полезем в код. Оказывается это предусмотреный функционал, только вот почему-то он не задокументирован. Таким образом переопределив метод queryset в классе админа можно скрыть объекты которые нельзя/ненужно показывать текущему пользователю.

В моем случае это выглядело так:
class MyAdmin(admin.ModelAdmin):
    #....
    def queryset(self, request):
        super_qs = super(MyAdmin, self).queryset(request)
        qs = super_qs.filter(group__in=request.user.groups.all())
        return qs

August 9, 2009

Секрет популярности поисковика Bing

Несколько дней назад вывел на экран лог файл одного из своих сайтов, смотрел на логи и наблюдал кто, откуда и куда ходит. Заметил интересную штуку, которой я решил поделиться после прослушивания подкаста Radio-T потому что там упомянули про популярность бинга. Этот поисковик от Microsoft якобы набрал почти 10%.

Как говорится в статье на компуленте, бинг обработал 9.4% поисковых запросов сделаных с территории США. Никто кроме самого микрософта не может определить обрабатывал ли бинг столько запросов, поэтому скорее всего речь идет о преходах от Bing на сайты.

Как вообще эти статистические компании определяют такие данные для меня всегда была закадка. Но технически сайт с которого приешел посетитель на другой сайт  определяется по заголовки. Т.е. это могут знать только на стороне бинга и на стороне сайта на который приходят посетители. Ну да ладно, пусть будет загадка. Кстати если кто-то знает как они это делают расскажите в комментариях.

Собственно в чем же секрет популярности? Так вот когда я просматривал логи заметил что резко появился трафик от бинга. Первые сомнительный мысли появилиь когда я попробовал загрузить страницу с которой перешел пользователь и не видел в выдаче и на соседних страницах моего сайта. На следующий день я не заметил в статистике сайта в Google Analytics этих переходов, т.е. бинга там вообще небыло. Заглянув в логи, отфильтровав строки в которых был бинг получил вот такие данные (строки с урлом куда ходит народ я удалил). Интересная штука в IP адресах. Вот информация по одному из них где видно что IP микрософтовского датацентра.

По логам можно сказать что якобы это бот индексирует контент. Нет! Потому что

  • есть отдельные запросы msn-бота

  • эти боты не дают referer заголовка

  • у бота который собирает контент для индексации специальный user-agent, здесь же он даже генерируется случайно

  • UPDATE: и самое главное, поисковый робот никогда не запрашивает статику (картинки, JS и CSS файлы), а этот запрашивает.

  • UPDATE: Все запросы идут из одной подсети - датацентра микрософт.


Так что вот мой прогноз рецепта популярности бинга. Снова M$ пытается надурить мир. Этот метод я уверен работает. Больше пишут о бинге (оо смотрите... бинг набирает обороты... круто!) и больше растет реальная аудитория. Интересно как дальше дела пойдут :)