• Как перенести все базы данных mysql на postgresql?

    @dimuska139
    Backend developer
    Ответ написан
    Комментировать
  • Реакт приложение и api сервер на одном хостинге?

    @dimuska139
    Backend developer
    В настройках хоста Nginx настройте как-то так:
    location ~ ^/api {
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header        Host $host;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_set_header        X-Real-IP       $remote_addr;
            proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass      http://127.0.0.1:1820;
        }
    
        location / {
            autoindex on;
            root /var/www/dist;
        }
    Ответ написан
    Комментировать
  • Как записать в бд django таблицу, а не строку?

    @dimuska139
    Backend developer
    Для начала я бы попробовал bulk_create, поделив эти 150к на чанки определенного (установить опытным путем) размера. А вообще конкретизируйте задачу, пожалуйста. Не очень понятно, зачем вам 150к строк в базу нужно писать каждые 10 секунд.
    Ответ написан
    Комментировать
  • Как эффективнее постепенно перевести Ruby-сайт (на шаблонизаторе) в React SPA?

    @dimuska139
    Backend developer
    В идеале сначала написать приемочные тексты для текущих страниц сайта, чтобы после переезда на SPA с SSR, быть уверенным, что ничего не пропало, не отвалилось и работает так, как работало.
    После этого делаете нужные API прямо в своем Ruby-бэкенде. Параллельно с этим создаете новый репозиторий для фронтенда и, собственно, его делаете. Тут вам поможет сам React и такая штука для него, как NextJS.
    Когда все сделаете, запускаете приемочные тесты и убеждаетесь, что вся функциональность работает, как и раньше.
    Ответ написан
    Комментировать
  • Как оптимизировать базу данных MySQL (innoDB)?

    @dimuska139
    Backend developer
    1. Включить логирование медленных запросов MySQL, после чего оптимизировать, добавить индексы.
    2. Обратить внимание на то, что индексы могут приводить и к падению производительности, так что неиспользуемые лучше удалять.
    3. Убедиться, что не просто индексы проставлены, а проставлены правильно.
    4. Включить логирование atop на несколько дней, чтобы была возможность понаблюдать, что происходить в системе, когда "начинает виснуть всё". Может быть, вообще не в MySQL дело?
    5. В Laravel запросы делаются к базе с помощью Active Record - бывает так, что вместо JOIN в базу летит гора запросов циклом - это не оптимально.
    6. Как уже выше писали, нужно использовать кеширование - это ощутимо снизит нагрузку.
    Ответ написан
    Комментировать
  • Правильное ли использование принципов DDD, и чем заменить Repository?

    @dimuska139
    Backend developer
    Вообще-то как раз Repository - это тот слой абстракции, который нужен, чтобы на уровне бизнес-логики (слой сервисов) абстрагироваться от способа хранения данных. То есть, очевидно, нужно использовать Repository.

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

    @dimuska139
    Backend developer
    Плюсы раздельных репозиториев:
    • Раздельный деплой. Фронты могут релизиться отдельно от бэкендеров. По факту правда на практике все равно им приходится согласовываться и релизиться разом, потому что почти всегда одни зависят от других.
    • Возможность издеваться над бэкендом: переписывать на другой язык, дробить на микросервисы и т.п. - и это никак не отразится на репозитории с кодом фронтенда.
    • Разделение команд. Фронтендеры не трогают (могут и не иметь доступ) код бэкендеров

    Минусов лично я не вижу
    Ответ написан
    Комментировать
  • Как правильно сделать position у записи в бд?

    @dimuska139
    Backend developer
    Сам недавно с такой же примерно задачей столкнулся, правда в Питоне. Храню позицию в базе, а при смене позиции "сдвигаю" нужные элементы, чтобы нужные позиции перестраивались. Возможно, Вам пригодится:
    touched_question = TestQuestion.objects.get(id=kwargs['question_id'])
    questions = TestQuestion.objects.filter(test_id=touched_question.test_id)
    for question in questions:
        if question.id != kwargs['question_id']:
            if touched_question.number < question.number <= new_number:  # Сдвиг вправо
                question.number -= 1
                question.save()
            if new_number <= question.number < touched_question.number:  # Сдвиг влево
                question.number += 1
                question.save()
        touched_question.number = new_number
        touched_question.save()

    Правда в моем случае данных мало, а в Вашем это решение, возможно, не будет оптимальным. Потому что тут запросы в цикле))
    Ответ написан
    Комментировать
  • Как получить содержимое страницы?

    @dimuska139
    Backend developer
    Ставите с помощью Composer библиотеку Guzzle и юзаете с флагом 'allow_redirects' => true - она сама будет следовать по редиректам, если сервер вернет 301/302.
    Ответ написан
    Комментировать
  • Как организовать грамотную доставку образа PHP приложения если необходим общий volume?

    @dimuska139
    Backend developer
    Зачем Вам ОБЩИЙ вольюм, доступный всем контейнерам? Если там ваши php-скрипты, то при деплое собирайте образы, пропихивая туда нужные файлы - и все.
    Ответ написан
  • Ошибки во время пагинации Django?

    @dimuska139
    Backend developer
    def product_list(request, category_slug=None):
        category = None
        categories = Category.objects.all()
        products = Product.objects.filter(available=True)
        page = request.GET.get('page')
        
        if category_slug:
            category = get_object_or_404(Category, slug=category_slug)
            products = products.filter(category=category)
        
        paginator = Paginator(products, 3)
    
    
        try:
            products = paginator.page(page)
        except PageNotAnInteger:
            products = paginator.page(1)
        except EmptyPage:
            products = paginator.page(paginator.num_pages)
    
        return render(request,
                    'products/list.html',
                    {'category': category,
                    'categories': categories,
                    'page': page,
                    'products': products})
    Ответ написан
    Комментировать
  • Как переключить bootstrap вкладку с помощью get запроса?

    @dimuska139
    Backend developer
    А для элементов с классом tab-pane кто будет класс active добавлять в зависимости от get-параметра?
    Ответ написан
    Комментировать
  • Так ли плохо использовать ORM?

    @dimuska139
    Backend developer
    Учитывая, что во многих проектах достаточно много простых запросов (выборка по одной таблице, вставка, обновление), ORM для них использовать удобно. Единственное, когда у вас имеются связи между сущностями, следует внимательно следить за тем, какие запросы делаются к СУБД и главное, сколько их. Для Django есть [django-debug-toolbar](https://github.com/jazzband/django-debug-toolbar), с помощью которого это можно отслеживать.

    Минусы ORM - неочевидность и недостаточная гибкость. Например, если мне нужно сделать UNION нескольких таблиц, для конкретного поля каждой из которых сделать alias (потому что нужные для сортировки поля называются в них по-разному), по которому выполнить сортировку всех результатов, думаю, от ORM придется отказаться. В реальных проектах, к сожалению, такие запросы встречаются сплошь и рядом, поэтому вместо ORM удобней использовать query билдеры.

    Но в Django на встроенную ORM много чего завязано, поэтому отказаться от нее сложно. Я имею в виду, что если не использовать в проекте на Django встроенную ORM, то и использовать Django вообще особо смысла не имеет.
    Ответ написан
    Комментировать
  • Нуждаюсь в code review, что не так с кодом?

    @dimuska139
    Backend developer
    То, как Вы все реализовали, называется Flat PHP. Такой код невозможно поддерживать, развивать или хотя бы просто покрыть тестами. Я бы порекомендовал взять какой-нибудь более-менее известный фреймворк, и эту же функциональность реализовать в нем. По крайней мере, ознакомитесь с шаблонами проектирования. Если говорить конкретно про Ваш код, то переделать надо все. Начиная с отделения шаблона от логики и заканчивая вынесением в конфигурационный файл приватных данных для подключения к СУБД. И, кстати, зачем вам в скрипте код создания таблицы?
    Ответ написан
  • Правильно ли так проектировать БД MySQL?

    @dimuska139
    Backend developer
    Такой подход допустим и используется в различных фреймворках. Например, в Django это Generic Relations. Но, с точки зрения проектирования баз данных, это антипаттерн, и делать так не рекомендуется. Потому что нарушается целостность данных. Вы не можете повесить внешний ключ на resource_id и сделать, скажем, каскадное удаление. То есть получается, что в resource_id может оказаться любое число, не соответствующее существующему id какой-либо таблицы.
    Делать так или нет, решать Вам. Но лично я бы не делал и держал отдельные таблицы.
    Ответ написан
    3 комментария
  • Сервер для Android приложения?

    @dimuska139
    Backend developer
    1. Локальная не вариант, потому что иначе как пользователи будут видеть чужие объявления?
    2. Да, нужен именно API-бэкенд с базой данных, с которым будет взаимодействовать Андроид-приложение. На чем его делать, решайте сами. Знаете Питон - пишите на нем (можно взять Django + Django Rest Framework), знаете другой язык - пишите на нем. Базу возьмите, скажем, MySQL или PostgreSQL.
    Ответ написан
    6 комментариев
  • Индексируют ли поисковики данные добавленные через JS?

    @dimuska139
    Backend developer
    Гугл может проиндексировать, но гарантий нет. Яндекс точно не проиндексирует. Так что не рекомендую так делать. А если у вас SPA-сайт на React/Angular/Vue, то обязательно сделайте SSR, если рассчитываете на органический трафик.
    Ответ написан
    Комментировать
  • Стоит ли учить css фрейворки по типу Bootstrap?

    @dimuska139
    Backend developer
    Тут для начала надо определиться, что такое sass. И это не фреймворк. В нем нет готовых компонентов, это просто метаязык, упрощающий написание css-кода. Например, есть переменные и т.п. А бутстрап - это набор стилизованных готовых компонентов (например, кнопки, таблицы). То есть это разные вещи, и sass не является заменой бутстрапу.
    Ответ написан
    Комментировать
  • Как автоматически выполнять команды на сервере от клиента при помощи Джанго?

    @dimuska139
    Backend developer
    Я бы Celery прикрутил и асинхронно эти команды выполнял.
    Ответ написан
    Комментировать
  • Запись в БД и Вывод с неё?

    @dimuska139
    Backend developer
    Все http-запросы делаете axiosом к api, написанному на Laravel или ещё чем-то. Laravel в свою очередь ходит в базу данных, достаёт оттуда данные (или пишет туда) - и отдает их обратно в json (например) в http-ответе. Напрямую с фронтенда в базу не ходят.
    Ответ написан
    Комментировать