• Как в Chi router обрезать префикс url?

    Maksclub
    @Maksclub
    maksfedorov.ru
    r.Get("/category", category.List)
    
    r.Route("/internal", func(r chi.Router) {
          r.Get("/category", category.List)
    })

    Не надо усложнять там, где не надо усложнять
    Если вы не зарегистрируете роут /internal/category, то хоть пообчищайтесь, этот роут не будет найден — то хэндлер для него не будет найден среди зарегистрированных
    Ответ написан
    1 комментарий
  • Golang PGX как добавлять значения в jsonb?

    @Wirusnyy-chel
    Когда вы указываете
    '{$1}'
    постгрес воспринимает это как просто строку, а не как параметр для вставки.


    Пробовал явно указывать тип $1
    query := `
    UPDATE type
    SET characteristics = jsonb_insert(
    characteristics, '{$1}'::text, '{"type": "$2", "measure": "$3"}'::jsonb
    )
    WHERE id=$4`

    Так тоже ошибка : function jsonb_insert(jsonb, text, jsonb) does not exist

    У функции jsonb_insert сигнатура
    jsonb_insert(target jsonb, path text[], new_value jsonb [, insert_after boolean])
    Поэтому строка `'{$1}'::text'`, должна быть `'{$1}'::text[]'`. (Но и это не совсем поможет)

    Можно преобразовать это следующим образом:
    query := `
        UPDATE type
        SET characteristics = jsonb_insert(
            characteristics, array[$1::text], 
           jsonb_build_object('type', $2, 'measure', '$3')
        )
        WHERE id=$4`
    
      tag, err := conn.Exec(ctx, query,
        c.Name,      // string
        c.Type,      // string
        c.Measure,   // string
        c.ID,        // uint64
      )


    Или позволить pxg самому собрать jsonb:

    query := `
        UPDATE type
        SET characteristics = jsonb_insert(
            characteristics, array[$1::text], $2
        )
        WHERE id=$3`
    
      tag, err := conn.Exec(ctx, query,
        c.Name,      // string
       struct{ // лучше вынести как отдельный тип
         Type string `json:"type"`
         Measure string `json:"measure"`
        }{c.Type, c.Measure}
        c.ID,        // uint64
      )
    Ответ написан
    3 комментария
  • Golang PGX как добавлять значения в jsonb?

    Melkij
    @Melkij
    PostgreSQL DBA
    сильно сомневаюсь, что $2 и $3 тоже у вас корректно указаны с точки зрения библиотеки и их хоть кто-то будет искать внутри текстового литерала, так что так:
    UPDATE type
        SET characteristics = jsonb_insert(
            characteristics, array[$1], jsonb_build_object('type', $2, 'measure', $3)
        )
        WHERE id=$4

    или
    update type set characteristics[$1] = jsonb_build_object('type', $2, 'measure', $3) WHERE id=$4;
    Ответ написан
    1 комментарий
  • Чем различаются версии Postgres 13, 14, 15?

    vabka
    @vabka
    Токсичный шарпист
    В документации же русским по белому написано:
    PostgreSQL 15 содержит много новых возможностей и улучшений, в том числе:
    • Поддержка SQL-команды MERGE.
    • Выборочная публикация содержимого таблицы в рамках логической репликации с возможностью указывать списки столбцов и фильтры строк.
    • Больше возможностей для использования сжатия и поддержка сжатия Zstandard (zstd). В том числе реализована возможность сжатия на стороне сервера при создании копии с помощью pg_basebackup.
    • Поддержка структурированного вывода журнала сервера в формате JSON.
    • Улучшения производительности, в частности, оптимизация операций сортировки в памяти и на диске.

    https://postgrespro.ru/docs/postgresql/15/release-...


    PostgreSQL 14 содержит много новых возможностей и улучшений, в том числе:

    • Хранимые процедуры теперь могут возвращать данные через параметры OUT.
    • Реализованы описанные в стандарте SQL параметры SEARCH и CYCLE для общих табличных выражений.
    • Операцию обращения по индексу теперь можно применять не только к массивам, но и к любому типу данных, для которого она имеет смысл. В этом выпуске такие операторы добавлены для типов jsonb и hstore.
    • Диапазонные типы были дополнены мультидиапазонными, позволяющими представлять несплошные диапазоны данных.
    • Проведена большая работа по улучшению производительности параллельных запросов, обработки многопоточной нагрузки, секционированных таблиц, логической репликации и процедуры очистки.
    • Изменения в индексах-B-деревьях теперь обрабатываются более эффективным методом, уменьшающим замусоривание индексов.
    • Процедура VACUUM автоматически становится агрессивнее и пропускает несущественные операции очистки в случае приближения базы данных к моменту зацикливания идентификаторов транзакций.
    • Расширенную статистику теперь можно собирать по выражениям, что позволяет получить лучшие планы для сложных запросов.
    • Библиотека libpq теперь поддерживает конвейерную передачу нескольких запросов, что позволяет ускорить получение результатов через сетевые соединения, которым свойственны большие задержки.


    https://postgrespro.ru/docs/postgresql/14/release-14
    Ответ написан
    Комментировать
  • Wireguard почему на разных ресурсах разный ip?

    @rav_pr
    как писали выше может быть несовершенный geoip у гугл.
    Плюс неизвестно когда и как этот ip анонсировали, блок адресов мог быть вообще арендованным

    Например мой ip на рахных сервисах определяется под разными провайдерами и проблема в том как это занесли в базы ripe

    Проверьте tracert и убедитесь что сервер территориальнео в казахстане
    Ответ написан
    9 комментариев
  • Wireguard почему на разных ресурсах разный ip?

    @rPman
    с сервером в Казахстане

    поэтому
    2ip как казахский


    ну а гугловские geoip похоже не совершенны
    Ответ написан
    7 комментариев
  • Postgresql ltree: как получить вершины (все записи без родителей)?

    Melkij
    @Melkij
    PostgreSQL DBA
    Обратите внимание, "получить записи яляющиеся вершинами" и "все записи без родителей" - это разные задачи.

    where nlevel(ltree) = 1 -- все записи состоящие из одного уровня.


    Записи без родителей - это когда у вас есть ltree "Top.Science.Space.Astronomy", но нет записи "Top.Science.Space"
    Ответ написан
    1 комментарий
  • Какие существуют источники информации с хорошими практиками advanced уровня по Go?

    @dcaraxes
    meme engineer
    На самом деле много хороих ресурсов есть. Из них отмечу следующие:
    YouTube -канал Николая Тузова https://www.youtube.com/@nikolay_tuzov, много качественно разобранных тем про устройство структур данных языка, GoGetPodcast, в которых частенько фигурирует Даниил Подольский, автор статьи https://habr.com/ru/company/oleg-bunin/blog/521582/

    Книга Михаила Цукалоса - https://www.piter.com/collection/all/product/golan...

    Style-guide с best practices от Uber - https://github.com/uber-go/guide
    Ответ написан
    Комментировать
  • Как сформировать деревья в json используя golang?

    @falconandy
    1. Достаете из БД все записи.
    2. Для каждой записи строковый path конвертируете в массив (слайс) числовых индексов (1.2.3 -> [1, 2, 3])
    3. Сортируете записи по этому массиву в лексикографическом порядке: [1], [1,3], [2], [2,4], [2,5], [2,5,6]
    4. За один проход по отсортированному списку записей вручную формируете итоговый json. Можно реализовать рекурсивно или итеративно.
    Ответ написан
    3 комментария
  • Как сформировать деревья в json используя golang?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Я-бы предложил для начала уйти от этого странного способа описанию деревьев к инверсному списку
    По сути - добавить еще одну колонку которая указывает на родителя.

    id name     path  parent
    -----------------------
    1  Беларусь 1     null
    2  Россия   2     null
    3  Минск    1.3   1
    4  Москва   2.4   2
    5  СПБ      2.5   2
    6  Невский  2.5.6 5


    Ну а дальше - select... connect prior и получим ранжированый курсор по дереву. Там-же будет
    доступно виртуальное поле level. И обходом этого курсора можно сделать JSON документ.
    Если level растет - то увеличиваем indentation и открываем вложенный элемент соотв.

    Если go-lang поддерживает stremable json writers то даже лучше.
    Ответ написан
    9 комментариев
  • Как отдавать статику через julienschmidt/httprouter?

    r.Handler("GET", "/", fServer)
    Этот шаблон значит полное совпадение с корнем, поэтому у вас 404 на все вложенные страницы. Чтобы этого избежать сделайте так:

    r.Handler("GET", "/*filepath", fServer)
    Ответ написан
    3 комментария
  • Docker compose меняет группу на 999 и выдает ошибку Permission denied?

    @mureevms
    999 - это UID пользователя postgres внутри контейнера. При инициализации БД, владельцем каталога /var/lib/postgresql/ назначается пользователь postgres. Когда вы маппите этот каталог в текущий (это следет из volumes), то конечно все рекурсивно будет принадлежать 999 UID'у. Это логичное и ожидаемое поведение.
    Чтобы решить можно изменить базовый образ, что запарно. Другие варианты:
    - назначить пользователю, работающему с этим каталогом, 999 UID в материнской системе
    - создать группу с 999 GID'ом и добавить пользователя в эту группу.

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

    iMedved2009
    @iMedved2009
    Не люблю людей
    SELECT p.name, FIRST_VALUE(c.data) over(order by version) as data
    FROM parent p
    JOIN children c on p.id=c.parent_id
    Group by p.name;

    Соррян не правильно прочитал

    Хотя это будет ещё проще
    SELECT p.name, c.data
    FROM parent p
    JOIN children c on p.id=c.parent_id and p.max_version = c.verstion;
    Ответ написан
    1 комментарий
  • SQL: Как вытащить уникальные записи по последней дате?

    rozhnev
    @rozhnev Куратор тега SQL
    Fullstack programmer, DBA, медленно, дорого
    В соответствии с наставлениями Akina :
    with order_files as (
    	select 
      		*, 
      		row_number() over (partition by filename order by version desc, created_at desc) rn
      	from files 
      	where user_id = 1
    ) select id, filename, user_id, version, created_at
    from order_files where rn = 1
    ;

    online sql editor
    Ответ написан
    1 комментарий
  • Для чего в Go используются указатели и где их лучше использовать?

    MAKAPOH
    @MAKAPOH
    многостаночник
    В первом случае при передаче параметра будет скопирована вся структура, во втором только указатель на структуру.

    В общем случае можно сказать что передача параметров через указатель ускоряет вызов функции и позволяет изменять внешние по отношению к функции данные. Слишком большое кол-во указателей может замедлить работу всей программы из за наличия сборщика мусора. Но это скорее граничные случаи, как именно поступать надо смотреть в каждом случае отдельно.
    Ответ написан
    1 комментарий
  • Для чего в Go используются указатели и где их лучше использовать?

    При передаче структуры в функцию showMePerson, структура копируется и внутри функции вы работаете с её копией. При этом, она скорее всего проскакивает через стек и не нагружает сборщик мусора.
    При передаче структуры по указателю в функцию showMePerson2 вы работаете с той же структурой, которую передали и можете её менять, например. Но она утекает у вас в кучу, создавая нагрузку на сборщик.
    Ответ написан
    3 комментария
  • Mutex RWMutex отличия?

    RWMutex нужен, когда у нас есть объект, который нельзя параллельно писать, но можно параллельно читать. Например, стандартный тип map.
    Перед записью в защищаемый мьютексом объект делается .Lock(), а вызовы .Lock() и .RLock() в других горутинах будут ждать, пока вы не отпустите мьютекс через .Unlock().
    Перед чтением защищаемого объекта делается .RLock() и только вызовы .Lock() в других горутинах блокируются, вызовы .RLock() спокойно проходят. Когда отпускаете мьютекс через .RUnlock(), ждущие вызовы .Lock() по-очереди могут забирать мьютекс на себя.
    Таких образом обеспечивается параллельное чтение объекта несколькими горутинами, что улучшает производительность.
    Ответ написан
    4 комментария
  • Полнотекстовый поиск в Windows 10?

    PowerShell
    Get-ChildItem “S:\Folder\” -recurse | Select-String -pattern “Text” | group path | select name


    Сам не сразу вспомнил что PowerShell мощь :)

    Даже еще круче, с Windows XP cmd

    find "Text" S:\Folder\*

    UPD: Оказывается в Windows 10 при поиске в папке, есть на вкладке поиск есть дополнительные параметры. В которых можно указать поиск в файлах и архивах ZIP. Так что все есть, дополнительное ПО не требуется.
    Ответ написан
    Комментировать