Чтение и редактирование файла дампа базы данных в Ruby - PullRequest
2 голосов
/ 12 марта 2019

Я хочу импортировать дамп базы данных в новую базу данных, в которой не есть все столбцы, которые были в старой базе данных.

Итак, чтобы игнорировать / удалить эти столбцы, моя идея - отредактировать dump.sql.

Как мне прочитать и отредактировать файл sql в ruby?

Создан дамп:

pg_dump --data-only old_database > dump_data_12_3_2019.sql;

Использование:

  • PostgreSQL 9.5
  • Ruby 2.5.1

Внутри файла sql:

COPY public.images (id, file, created_at, updated_at, rotation) FROM stdin;
255 31265d7843.JPG  2018-11-15 09:05:43.37898   2018-11-15 09:05:43.37898   0
256 78e834e4e7.JPG  2018-11-15 09:05:43.571389  2018-11-15 09:05:43.571389  0
257 7b6662659b.JPG  2018-11-15 09:05:44.275989  2018-11-15 09:05:44.275989  0
215 6fe307f4b5.jpg  2018-10-15 11:08:59.42583   2018-10-15 11:12:25.284024  0

Заголовок начинается с COPY, имена столбцов находятся внутри ( ), а данные находятся ниже с пробелом дляразделитель.

Как убрать вращение столбца и его данные?

Ответы [ 2 ]

1 голос
/ 12 марта 2019

Вы должны «обновить» исходный файл sql, удалив столбцы (недоступные в новой БД) и данные этих столбцов.

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


path = '/tmp/source'
temp_file = Tempfile.new('output')
begin
  File.open(path, 'r') do |file|
    file.each_line do |line|
      # change the line according your logic
      temp_file.puts  new_line
    end
  end
  temp_file.close
ensure
  temp_file.close
  temp_file.unlink
end

После этого целевой файл можно восстановить с помощью команд pg .

psql -U <username> -d <dbname> -1 -f <filename>.sql
* 1010.* или
pg_restore -U <username> -d <dbname> -1 <filename>.dump
0 голосов
/ 12 марта 2019

Вам нужно открыть файл (1), разделить команды (2), затем выполнить некоторую операцию, чтобы отредактировать код SQL (3) и, наконец, запустить его (4).

contents = File.read('path/to/file.sql') # (1) If the file is huge, do not read it whole, but line by line
commands = contents.split(';') # (2) probably you'll need something more clever (hint: regex) because of the ; character in the data
commands.each do |command|
  stripped_command = strip_some_columns(command) # (3)
  ActiveRecord::Base.connection.execute(stripped_command) # (4)
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...