ФорумПрограммированиеPythonDjango → Фишки джанго

Фишки джанго

  • AlexB

    Сообщения: 4290 Репутация: N Группа: в ухо

    Spritz 29 октября 2011 г. 1:55

    Сюда буду бросать неочевидные вещи, пока одна:

    1. Знаете ли вы, что если попробовать с помощью джанговской ORM начать обрабатывать большое количество записей (например миллион), то через некоторое время скрипт загибается? Представляете, сколько раз икнулось разработчикам пока я обрабатывал такую базу? Три раза я переписывал скрипт, запускал его на ночь и с утра обнаруживал мертво висящий компьютер. Решение оказалось элементарным, надо просто … отключить дебаг! Вот так:
    from django.conf import settings
    settings.DEBUG = False

    Фишка в том, что при дебаге все SQL запросы джанга логирует в памяти и в конце концов она просто заканчивается …
  • phpdude

    Сообщения: 26624 Репутация: N Группа: в ухо

    Spritz 29 октября 2011 г. 3:04, спустя 1 час 9 минут 39 секунд

    очевидная хуйня на самом деле :)))

    Сапожник без сапог
  • AlexB

    Сообщения: 4290 Репутация: N Группа: в ухо

    Spritz 29 октября 2011 г. 4:11, спустя 1 час 6 минут 35 секунд


    очевидная хуйня на самом деле :)))
    Ага, когда стало известно в чем дело, кажется очевидным. А до того как нашел, голову ломал откуда утечки памяти. И два опытных питонщика, которые со мной работают … тоже хуй подсказали …
  • Абырвалг

    Сообщения: 6476 Репутация: N Группа: Джедаи

    Spritz 29 октября 2011 г. 5:18, спустя 1 час 7 минут 21 секунду

    нас тоже такая "проблема" настигла, но мы ж симфоебы.

    а как-нить более нормально это исправить в джанго нельзя? вот у нас в сраном пхп можно рантайм отключить чисто логгирование скл. Или даже более правильно поступить - ограничить размер буффера (логи-то на диск/в базу сбрасываться будут).
    Спустя 95 сек.
    http://slides.seld.be/?file=2011-10-20+High+Performance+Websites+with+Symfony2.html#37
  • NRG

    Сообщения: 4761 Репутация: N Группа: в ухо

    Spritz 30 октября 2011 г. 13:11, спустя 1 день 7 часов 52 минуты

    джанга-хуянга
    Спустя 75 сек.
    извините, не сдержался)
  • AlexB

    Сообщения: 4290 Репутация: N Группа: в ухо

    Spritz 30 октября 2011 г. 13:17, спустя 6 минут 28 секунд


    джанга-хуянга
    Спустя 75 сек.
    извините, не сдержался)
    ничего, ничего, все знают, что повтореная дважды шутка - смешна вдвойне
  • Sinkler

    Сообщения: 7931 Репутация: N Группа: в ухо

    Spritz 30 октября 2011 г. 13:19, спустя 1 минуту 59 секунд

    вухаха))))
  • adw0rd

    Сообщения: 22905 Репутация: N Группа: в ухо

    Spritz 30 октября 2011 г. 23:02, спустя 9 часов 42 минуты 58 секунд

    ничего, ничего, все знают, что повтореная дважды шутка - смешна вдвойне

    +1
    adw/0
  • AlexB

    Сообщения: 4290 Репутация: N Группа: в ухо

    Spritz 30 октября 2011 г. 23:15, спустя 13 минут


    а как-нить более нормально это исправить в джанго нельзя? вот у нас в сраном пхп можно рантайм отключить чисто логгирование скл.
    Честно? Не знаю! Но нужды особой не вижу. Дебаг нужен пока ты тестируешь на небольших тестовых данных, а когда запускаешь с реальным объемом, нафиг он сдался? Тут должно все без ошибок отработать …
  • adw0rd

    Сообщения: 22905 Репутация: N Группа: в ухо

    Spritz 31 октября 2011 г. 0:54, спустя 1 час 38 минут 40 секунд

    AlexB, +1
    Спустя 37 сек.
    Но вообще, смотрите модуль https://docs.djangoproject.com/en/dev/topics/logging/
    adw/0
  • mathete

    Сообщения: 435 Репутация: N Группа: Джедаи

    Spritz 2 декабря 2011 г. 5:41, спустя 32 дня 5 часов 47 минут

    Понимаю, что теме месяц. Но всё же хотел добавить.
    1. Это именно фишка джанго. Очень удобный инструмент для дебагинга. И на основе этого и работает sql дебагинг во всяких джанго-тулбарах.
    2. Это не логгинг в стандартном понимании.
    3. Под капотом всё просто:
    в django.db есть connection - текущий connection к базе. Я тут опускаю работу с несколькими базами, но всё аналогично.
    У этого connection есть атрибут queries - это как раз список всех запросов. Каждый запрос - это словарь {'time':<время_выполнения>, 'sql':<sql_отправленный_в_базу>}
    И обычно работа происходит так:


    from django.db import connection

    from someapp.models import SomeModel, AnotherModel..

    try:
    qs = SomeModel.objects.filter(….).extra(….)
    qs2 = AnotherModel.objects.filter(….).values(….).annotate(….)
    # и так далее..
    # короче много запросов и может даже какой-то из них валится и не понять почему

    finally:
    for q in connection.queries:
    print q['time'], ' :: ', q['sql']




    4. Если же у вас куча запросов и нужен DEBUG=TRUE, то просто периодически сбрасывайте connection.queries

    Ну предположим у вас какой-нибудь бесконечный цикл и в нем обращения к базе.

    from django.db import connection

    while True:

    # тут эти все ваши запросы
    …..

    # и в конце итерации
    connection.queries = []



  • adw0rd

    Сообщения: 22905 Репутация: N Группа: в ухо

    Spritz 3 декабря 2011 г. 9:59, спустя 1 день 4 часа 18 минут

    ага, либо рвать соединение надо переодически
    adw/0
  • mathete

    Сообщения: 435 Репутация: N Группа: Джедаи

    Spritz 3 декабря 2011 г. 13:28, спустя 3 часа 29 минут 7 секунд

    Если баз несколько и не обязательно, лучше всего юзать *reset_queries*
    https://code.djangoproject.com/browser/django/trunk/django/db/__init__.py#L39

    Она слушает сигнал request_started. Именно так сбрасываются запросы при обычной работе.
  • adw0rd

    Сообщения: 22905 Репутация: N Группа: в ухо

    Spritz 3 декабря 2011 г. 21:28, спустя 8 часов 17 секунд

    Сенкью, буду иметь ввиду
    adw/0
  • phpdude

    Сообщения: 26624 Репутация: N Группа: в ухо

    Spritz 3 марта 2016 г. 13:25, спустя 1551 день 15 часов 56 минут

    Если баз несколько и не обязательно, лучше всего юзать reset_queries
    https://code.djangoproject.com/browser/django/trunk/django/db/__init__.py#L39

    Она слушает сигнал request_started. Именно так сбрасываются запросы при обычной работе.

    @mathete, FAQ: Databases and models | Django documentation | Django [docs.djangoproject.com]

    ага

    Сапожник без сапог

Пожалуйста, авторизуйтесь, чтобы написать комментарий!