Nano Hash - криптовалюты, майнинг, программирование

pg_dump для создания дампа схемы таблицы с ограничением как компактным

Мой pg_dump, возвращающий ограничения, находится в запросе на изменение в конце файла дампа. Я хочу, чтобы они были внутри раздела создания таблицы (...).

Например. Я создал таблицу, как показано ниже, с ограничением:

CREATE TABLE "test_constraints" (
    "id" serial NOT NULL,
    "user_id" bigint NOT NULL,
    PRIMARY KEY ("id"),
    CONSTRAINT "user_id" UNIQUE ("user_id")
);

И получение дампа схемы с помощью следующей команды:

pg_dump.exe -U postgres -t "test_constraints" -f "D:\dump.sql" "postgres"

Возможно ли иметь схему таблицы такой, какая она есть (или близкая к ней), когда я ее создал? Я имею в виду, что ограничения должны быть внутри таблицы создания (...);


  • Насколько я знаю, это невозможно. Зачем тебе это? 05.12.2013
  • Многие генераторы ERD наивно анализируют определения таблиц (как описано в OP). Но без ограничений эти инструменты не могут добавить отношения между таблицами. Я думаю, что это довольно распространенный вариант использования, когда массовая загрузка данных не имеет значения, поскольку в дампе может даже не быть данных. 19.03.2021

Ответы:


1

Нет, это невозможно. На самом деле все делается так не просто так.

Проблема в том, что дамп обычно предназначен для массовой загрузки, поэтому вы хотите создать индексы после загрузки данных. Это означает, что вы хотите сделать это в три шага:

  1. Определите таблицу
  2. Загрузите данные
  3. создать индексы

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

22.12.2013
  • Я понимаю причины добавления индексов и т. д. после загрузки данных. Тем не менее было бы очень полезно иметь возможность генерировать ddl, где первичный ключ находится в операторе создания таблицы. 05.07.2017
  • Многие генераторы ERD наивно анализируют определения таблиц (как описано в OP). Но без ограничений эти инструменты не могут добавить отношения между таблицами. Я думаю, что это довольно распространенный вариант использования, когда массовая загрузка данных не имеет значения, поскольку в дампе может даже не быть данных. 19.03.2021

  • 2

    Я знаю, что это довольно старый вопрос, и в большинстве случаев я согласен с Крисом в том, что это не то, что вы действительно хотели бы делать (поскольку любые внешние ключи будут создавать проблемы, если вы не восстановите таблицы в точном порядке); однако, поскольку это довольно высокий результат в поиске Google по заданному мной вопросу, и никто на самом деле не дал ответа на сам вопрос, это может быть полезно с оговоркой, что вам, вероятно, не следует использовать его, если вы не знаете, что вы' делаешь...

    Этот скрипт bash (я не буду называть его однострочным, потому что это не совсем так, хотя он будет работать, если вы просто вставите его в командную строку) выводит список таблиц (для общедоступной схемы) из psql и запускает каждую таблицу отдельно через pg_dump, затем объединяет ограничения в определение основной таблицы, выводя результат каждой таблицы в файл, имя которого основано на имени таблицы.

    Вы также можете выбрать SELECT из таблиц схемы, чтобы получить имена таблиц, а не анализировать вывод из \dt; Я считаю, что запомнить, как делать одно, наверное, так же сложно, как и другое.

    Это то, что мне было нужно для моего конкретного приложения, я не гарантирую, что это будет работать для вашего (или даже для конкретной версии pg_dump), но у вас не должно возникнуть особых проблем с его модификацией. Конечно, есть лучшие способы сделать вторую часть (вероятно, используя awk), но это было просто и сделало работу. Я игнорирую все, кроме создания таблицы, ограничений и владения; если вы хотите добавить другие строки, вам нужно добавить дополнительные тесты в строку /OWNER TO/...

    DB=mydb; s=1; psql -tA -F, -c '\dt public.*' $DB | cut -f2 -d, | while read t ; do 
      (
        rm -f "$t.sql2"; pg_dump -sx -t "$t" $DB | grep -v -e '^--' -e '^set' -i | while read a; do
          if [ $s -eq 1 ] ; then 
            if [ "a$a" = 'a);' ] ; then s=2 ; else echo $a ; fi; 
          elif [ $s -eq 2 ] ; then 
            b=$(echo $a | sed -e 's/\s*ADD CONSTRAINT\(.*\);/CONSTRAINT \1/')
            if [ "a$b" != "a$a" ] ; then 
              echo ",$b"
            elif [ "a$a" != "a${a/OWNER TO/}" ] ; then 
              echo $a >> "$t.sql2"
            fi
          fi
        done
        echo ");"
      ) > "$t.sql"
      if test -f "$t.sql2" ; then cat "$t.sql2" >> "$t.sql"; rm -f "$t.sql2"; fi
    done
    
    27.03.2015
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..