Весь вывод журнала обрабатывается обработчиками; просто добавьте logging.StreamHandler()
к корневому логгеру.
Вот пример настройки обработчика потока (с использованием stdout
вместо значения по умолчанию stderr
) и добавления его в корневой логгер:
import logging
import sys
root = logging.getLogger()
root.setLevel(logging.DEBUG)
handler = logging.StreamHandler(sys.stdout)
handler.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)
root.addHandler(handler)
В соответствии со стандартом SQL вы не можете использовать неагрегированные столбцы в списке выбора. MySQL допускает такое использование (если не используется режим ONLY_FULL_GROUP_BY), но результат непредсказуем.
Вы должны сначала выбрать fromEmail, MIN (чтение), а затем во втором запросе (или подзапросе) - Subject.
Вот один из подходов:
SELECT cur.textID, cur.fromEmail, cur.subject,
cur.timestamp, cur.read
FROM incomingEmails cur
LEFT JOIN incomingEmails next
on cur.fromEmail = next.fromEmail
and cur.timestamp < next.timestamp
WHERE next.timestamp is null
and cur.toUserID = '$userID'
ORDER BY LOWER(cur.fromEmail)
По сути, вы присоединяете таблицу к самой себе, ища более поздние строки. В предложении where вы указываете, что не может быть более поздних строк. Это дает вам только последнюю строку.
Если может быть несколько электронных писем с одной и той же меткой времени, этот запрос потребует уточнения. Если в таблице электронной почты есть столбец инкрементного идентификатора, измените СОЕДИНЕНИЕ, например:
LEFT JOIN incomingEmails next
on cur.fromEmail = next.fromEmail
and cur.id < next.id