LINUX.ORG.RU

Питон, сократить код


0

0

Хочется странного, а именно покороче написать следующее:

if day is None:
    c.execute('SELECT SUM(size) FROM logdb WHERE user_id=%s AND MONTH(date)=%s', [user_id, month])
else:
    c.execute('SELECT SUM(size) FROM logdb WHERE user_id=%s AND MONTH(date)=%s AND DAY(date)=%s', [user_id, month, day])

Селекты отличаются только наличием или отсутствием дня. Есть возможность записать как-то по другому ? У самого мозг не доходит.

★★

Это будет самый удобный способ. Тебе потом не нужно будет выяснять что за костыль ты использовал, что бы сократить код.

xpahos ★★★★★
()

при выполнении условия загоняй "AND DAY(date)=%s" отдельную переменную, иначе оставляй в ней пустую строку. И подставляй эту переменную в запрос.

Turbid ★★★★★
()

если охота сократить, то можно как-то так:

'SELECT SUM(size) FROM logdb WHERE user_id=%s AND MONTH(date)=%s ' + day is None and " or 'AND DAY(date)=%s'

Pi ★★★★★
()
Ответ на: комментарий от Pi

>+ day is None and '' or 'строка'

Какой ужас. И эти кавычки - поначалу искал парную двойную.

Автор, если таких строк всего 2, то не нужно сокращать.

legolegs ★★★★★
()
s = "SELECT SUM(size) FROM logdb WHERE user_id=%s AND MONTH(date)=%s" % (user_id, month)
if day is not None:
    s = s + " AND DAY(date)=%s" % day
c.execute(s)
Lucky1 ★★★
()
Ответ на: комментарий от Lucky1

Автор наверное хотел сократить код без нанесения ущерба секьюрити и перформансу (в случае кэширования запросов типа как в Оракле).

Absurd ★★★
()
Ответ на: комментарий от Pi

>да, но где там инъекции? :)

Достаточно того что код не эквивалентен. В исходном варианте параметры в запрос вставляет сам сервер или клиентская либа, в твоем - клиент.

Absurd ★★★
()
query='SELECT SUM(size) FROM logdb WHERE user_id=%s AND MONTH(date)=%s'
params=[user_id, month]
if day is not none:
  query+=' AND DAY(date)=%s'
  params.append(day)
c.execute(query,params)

строк больше, но символы сэкономил :). Можно догнать оригинал, если опциональных параметров будет несколько больше, заменив if на for.

DonkeyHot ★★★★★
()

ничего не трогай или используй orm. Никто и никогда символы не экономит ибо кол-во строк не есть однозначный критерий "правильности" кода. Сэкономишь символы и потеряешь в простоте понимания кода.

true_admin ★★★★★
()

2 селекта сокращать до 1 не интересно. Лучше сократим 16 селектов до 1.

я не помню, можно ли в питоне делать " многострочными

кодирование несуществующих дней, ... тут другое, так что очевидно надо добавить перекодирование типа day = day is None ? 32 : day


c.execute('
    SELECT SUM(size)
    FROM logdb 
    WHERE (''=%s   OR user_id=%s)
      AND (1234=%s OR YEAR(date)=%s)
      AND (13=%s   OR MONTH(date)=%s)
      AND (32=%s   OR DAY(date)=%s)
',[ user_id, user_id, year, year, month, month, day, day ]
)
www_linux_org_ru ★★★★★
()
Ответ на: комментарий от FeiWongReed

А sqlalchemy нормально работает с таблицами в 50-70 миллионов строк ?

spiro ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.