1. Python / Говнокод #28524

    +1

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    def __get_column_names(table: str) -> tuple:
        try:
            with conn:
                cur.execute("SELECT name FROM PRAGMA_TABLE_INFO(?)", (table,))
                column_names = cur.fetchall()
        except Exception as excpt:
            print(excpt)
        column_names = tuple(i[0] for i in column_names)
        return column_names
    
    
    def db_register_user(user_data: types.User):
        """
        SQL запрос для внесения данных о пользователе
    
        Args:
            user_data: telebot User объект, содержащий словарь с параметрами пользователя
        """
        user_data = user_data.to_dict()
        column_names: tuple = __get_column_names('Users')
        user_values = tuple(user_data.get(key) for key in column_names if key in user_data)
        try:
            with conn:
                query = 'INSERT INTO Users cn'.replace('cn', str(column_names))+' VALUES (?,?,?,?,0,3)'
                parameters = (*user_values,)
                conn.execute(query, parameters)
        except Exception as excpt:
            print(excpt)
        conn.close()

    На сколько в такой ситуации .format не безопасен? Идея в том, чтобы не объебошится программисту в коде введя неверное значение колонки. Для этого имена колонок берутся из самой базы (есть мысль ещё и типы брать). Есть вариант реализации получше? Спасибо

    Запостил: rockkley94, 26 Декабря 2022

    Комментарии (82) RSS

    • то есть .replace, а не .format
      Ответить
    • Лучше так не делай а пиши названия колонок сам
      Ответить
      • Почему не делать-то? Таким образом я могу сделать универсальную функцию, которая каждый раз будет давать корректные имена из самой бд. Если бы я понимал, почему так лучше не делать (по твоим словам), я бы не постил это сюда)
        Ответить
        • Белые люди описывают модель на питоне, и автоматически получают по ней код для CRUD. Типы и имена колонок проверяются автоматически.

          Серьезно, не нужно делать кривое квадратное колесо
          https://docs.djangoproject.com/en/4.1/topics/db/models/
          Ответить
          • This. И да, белым людям после этого тайпчекер («mypy»/«pyright»/«pylance») проверяет типы колонок и удостоверяется, что белый человек не присвоил не то не тому, а IDE — подсказывает названия и подчёркивает опечатки.
            Ответить
        • а как ты ими будешь пользоваться, если ты их имён не знаешь?
          Ответить
        • Схема данных это самое важное что есть в твоем коде. Из нее ты строишь модели, из них проектируешь API. Общее правило - ты всегда подстраиваешь код приложения под бд, не наборот.

          Проблемы с твоим подходом:
          1) Ты делаешь два запроса в бд когда можно делать один. Это увеличивает время обработки запроса и больше потенциальных точек отказа.
          2) У тебя захардкожено 4 параметра в кверю если я правильно понимаю, то есть тебе все равно придется менять это место в коде когда захочешь поддерживать новую колонку.
          3) Если ты будешь добавлять новые колонки не строго в конец таблицы, то рано или поздно ты знапишешь что-то не так. С твоим подходом, ты в принципе сильно повышаешь вероятность что-то записать не так.
          4) Именнованные параметры намного лучше читаются в логах или инструментации твоей бд.
          Ответить
          • >Общее правило - ты всегда подстраиваешь код приложения под бд, не наборот.
            Есть и другой подход. Скажем, EF умеет генерировать схему по коду, но как правило схема получается не очень.

            А например в Django модель хоть и описываеца на питоне, но всё равно четко отражает СУБД
            Ответить
            • > умеет генерировать схему по коду,

              - graphql вроде так же делает
              Ответить
          • > Общее правило - ты всегда подстраиваешь код приложения под бд, не наборот.

            Опровергаю. Есть бизнес-контракты, требования к самому приложению, есть апи, которое оно должно предоставлять. Обычно оно выражается в каких-то структурах-объектах и сервисах. И вот уже от них пляшет вообще всё остальное.
            Ответить
            • Так речь же о слое доступа к СУБД

              Ты можешь сделать АПИ сервиса леера в бизнес-терминах, а слой доступа к базе в терминах базы, а потом их склеить, не?
              Ответить
            • >Есть бизнес-контракты, требования к самому приложению, есть апи, которое оно должно предоставлять

              В продуктовой разработке ничего этого нет. Именно потому я за продуктовую разработку.
              Ответить
              • У j124 вообще никаких баз нет
                Ответить
                • Именно поэтому я за «j124».
                  Ответить
                  • У Путина тоже никаких баз нету. Он вообще компьютером пользоваться не умеет.
                    Ответить
                    • Сенсация! Разгадан секрет, почему россияне голосуют за nymuHa!
                      Ответить
              • а куда делся bootcamp_dropout
                Ответить
                • Я сюда год уже не заходил, оказывается

                  Сам как?
                  Ответить
                  • А почему не заходишь?
                    Ответить
                    • раньше я очень любил нишевые технические дискуссии и маргинальные интернет-субкультуры, и я их тут находил

                      теперь или я не тот, или этого стало меньше
                      Ответить
                      • Приведи пример
                        Ответить
                        • Пример чего?
                          Ответить
                          • Пример дискуссий и саб-культур
                            Ответить
                            • Дискуссия https://govnokod.ru/28232#comment778761

                              Субкультуры позже найду
                              Ответить
                              • Анимешники https://govnokod.xyz/_27374/#comment-621568

                                Дискуссии позже найду
                                Ответить
                                • Ты, кстати, в Uber работаешь?
                                  Ответить
                                  • да
                                    Ответить
                                    • Говно ебаное ваш Uber.
                                      Пол часа переписываешься с водителем, который хочет назначить цену выше, чем в приложении, в итоге соглашается как есть, либо уезжает нахуй, не отменяя заказ.
                                      Если приезжает, то ты садишься в машину и он отменяет заказ, чтобы я ему рейтинг хуёвый не въебал. А рейтинг у водителя 5.0, хуле.
                                      Ответить
                                      • > А рейтинг у водителя 5.0, хуле.

                                        Дайте угадаю. Рейтинг состоит из единственной оценки?
                                        Ответить
                                        • Нет. Когда он посрался с пассажиром, он отменяет поездку. Когда не посрался, то ведёт себя нормально и ему ставят норм оценку.
                                          Ответить
                                          • Какой лайфхак )))
                                            Ответить
                                            • Ещё делюсь лайфхаком, если пассажир платит наличкой.
                                              Получаешь X$ от пассажира наличкой. А в приложении отмечаешь, что пассажир дал X$-5$. 5$ — твой заработок с нихуя, а у пассажира долг.


                                              А если долг выше какого-то порога, то его нельзя оплатить наличными при следующей поездке и в самый неподходящий момент (нужно ехать в аэропорт, например) выясняется, что тебе отказывают в обслуживании до погашения долга.
                                              Ответить
                                              • Какой симбиоз судебных приставов и погранслужбы рф ))))))
                                                Ответить
                                              • зачем платить в убере наличкой?

                                                > твой заработок с нихуя, а у пассажира долг
                                                – и сколько раз прокатывает такой фокус?
                                                Ответить
                                                • Если бы пассажир за такие шутки бил в глаз, прокатило бы максимум два раза.
                                                  Ответить
                                                • > зачем платить в убере наличкой

                                                  Почему-то карту мою не принимал.

                                                  > и сколько раз прокатывает такой фокус?

                                                  Сколько угодно раз. Ведь в поддержку даже пожаловаться нельзя.

                                                  Uber — говно ебаное. Это вам не "Яндекс.Такси", где водителя бы выебали за это.
                                                  Ответить
                                                  • > Ведь в поддержку даже пожаловаться нельзя

                                                    – что, простите

                                                    Не, я понимаю, что она там в приложении на уровне автоответчика, но вроде ж есть пункт "возникла проблема с поездкой"

                                                    но вообще в уберах у водилы больше вариантов кинуть пассажира, чем наоборот, это да
                                                    Ответить
                                      • какая служба поддержки)))
                                        Ответить
                              • Го бухать, субкультуру на месте организуем
                                Ответить
                                • ты в Амстердаме?
                                  Ответить
                                  • Ja, dat klopt. Ik ben nu in een ander land, maar na week kom ik terug.
                                    Ответить
                                    • На русский!
                                      Ответить
                                      • Он говорит, что если ты несогласен, тебя зарежут. Шутка.
                                        Ответить
                                    • я тоже уезжаю на неделю, можем потом бухнуть
                                      Ответить
                                      • ура!

                                        (нас тут двое кстати из-под геста пишет, если что)
                                        Ответить
                                        • второй пусть тоже присоединяется
                                          Ответить
                                          • Geen probleem, dat kan. Laten we na week hier ook ontmoeten om afspraak te maken?
                                            Ответить
                                          • ну и что дальше???
                                            Ответить
                                            • ну я готов бухать если что, у меня вполне лирическое настроение
                                              Ответить
                                              • да я тоже, буткемп-то где
                                                Ответить
                                                • Geen idee.

                                                  Waaneer kan je naar Asmterdam?
                                                  Ответить
                                                  • Вообще я планировал совместить с заездом к пацанам в дельфт, но они сами завтра приезжают. Середина сентября было бы норм, но если горит, то можно и раньше.
                                                    Ответить
                                                • Разве можно бухать при приёме антидепров?
                                                  Ответить
                                                  • Найди человека, который так не делает

                                                    Но я не принимаю уже больше трёх лет

                                                    Они тупо не работают
                                                    Ответить
                                                    • А ты разные пробовал?
                                                      Ответить
                                                      • До десятка наименований
                                                        Ответить
                                                        • Решил забить хуй?
                                                          Ответить
                                                          • Не работают
                                                            Ответить
                                                            • По ходу действия романа он несколько раз пытается помочь окружающим: парню, с которым познакомился в тюрьме (тот оказался там за попытку заняться сексом с арбузами фермера);
                                                              Ответить
                                  • В поездной доступности
                                    Ответить
                                • Ёбаное хуйло. Раньше по пятницам и субботам нужно было бронировать место в баре, а сейчас там из посетителей полторы колеки в субботу вечером.
                                  Ответить
                              • Да, с гологубом весело было
                                Ответить
                  • ебошим потихоньку
                    Ответить
          • Спасибо за обратную связь. Я ушёл на Go
            Ответить
    • Не нужно велосипедить, пожалуйста. Возьми SQL Alchemy или Django ORM, и не создавай динамическую хрень
      Ответить
    • А как выглядит types.User?
      Ответить
    • Бакланский полулстров
      Ответить

    Добавить комментарий