Существует ли простой инструмент для преобразования mysql в postgresql синтаксис?

Хорошо, это заняло больше времени, чем я ожидал, но следующий код должен работать для произвольного числа имен и чисел, учитывая следующие требования:

  • На данный момент имена считаются одиночными персонажи - это может быть изменено с помощью regexp или что-то вроде этого.
  • Все ваши ax.bx.cx.... могут быть сохранены в какой-то подчиненной структуре вашим приложением (заранее).
  • Ваша структура всегда следует представленному порядку ax.bx.cx..., а размеры матрицы равны.

Итак, сценарий довольно длинный и - я боюсь - нуждается в некотором объяснении. Пожалуйста, просто спросите. Основная идея состоит в том, чтобы проходить через структуру (ы), пока конкретные «потомки» все еще являются структурами. Это обеспечивает произвольную «глубину» структур, то есть количество имен и номеров.

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

Кроме того, вначале не нужно Names или Numbers, поскольку эта информация автоматически извлекается из (должна быть там подчиненной) структуры.

(Внимание: написано в Octave. Я пытался проверить, что все функции также доступны в Matlab. Пожалуйста, сообщите о любых проблемах, если это не так. Затем я проведу рефакторинг кода.)

% Structs given.
a1.b4.c2.d3 = ones(4, 4);
a1.b4.c4.d3 = ones(4, 4) * 2;
a1.b4.c5.d3 = ones(4, 4) * 3;
a1.b6.c2.d3 = ones(4, 4) * 4;
a1.b6.c4.d3 = ones(4, 4) * 5;
a1.b6.c5.d3 = ones(4, 4) * 6;
a2.b4.c2.d3 = ones(4, 4) * 7;
a2.b4.c4.d3 = ones(4, 4) * 8;
a2.b4.c5.d3 = ones(4, 4) * 9;
a2.b6.c2.d3 = ones(4, 4) * 10;
a2.b6.c4.d3 = ones(4, 4) * 11;
a2.b6.c5.d3 = ones(4, 4) * 12;

% REQUIREMENT: Store your structs in some superordinated struct.
super.a1 = a1;
super.a2 = a2;

% Initialize combined struct for names and numbers.
NamesNumbers = struct();

% Initialize Names cell array.
Names = {};

% Extract names and numbers from superordinated struct.
totalNames = 0;
totalNumbers = 1;
current = super;
while (isstruct(current))
  fields = fieldnames(current);
  totalNames = totalNames + 1;
  totalNumbers = totalNumbers * numel(fields);
  for iField = 1:numel(fields)
    field = fields{iField};
    name = field(1);
    Names{totalNames} = name;
    number = field(2:end);
    if (isfield(NamesNumbers, name) == false)
      NamesNumbers.(name) = str2num(number);
    else
      NamesNumbers.(name) = [NamesNumbers.(name) str2num(number)];
    end
  end
  current = current.(fields{1});
  if (isstruct(current) == false)
    [nRows, nCols] = size(current);
  end
end

% Extract all values from superordinated struct.
level = struct2cell(super);
while (isstruct([level{:}]))
  level = struct2cell([level{:}]);
end
values = vertcat(level{:});

% Determine indices.
maxIdx = cellfun(@(x) max(x), struct2cell(NamesNumbers));
idx = zeros([totalNumbers, totalNames]);
factorProd = 1;
for iName = 1:totalNames
  numbers = NamesNumbers.(Names{iName});
  n = numel(numbers);
  factorProd = factorProd * n;
  inner = totalNumbers / factorProd;
  resh = totalNumbers * n / factorProd;
  outer = factorProd / n;
  column = repmat(reshape(repmat(numbers, inner, 1), resh, 1), outer, 1);
  START = (iName - 1) * totalNumbers + 1;
  STOP = iName * totalNumbers;
  idx(START:STOP) = column;
end

% Initialize output.
output = zeros([nRows nCols maxIdx']);

% Fill output with values.
for iIdx = 1:size(idx, 1)
  temp = num2cell(idx(iIdx, :));
  START = (iIdx - 1) * nRows + 1;
  STOP = iIdx * nRows;
  output(:, :, temp{:}) = values(START:STOP, :);
end
15
задан meleyal 18 September 2008 в 12:24
поделиться

4 ответа

Существует mysqldump опция, которая заставляет его произвести код PostgreSQL:

mysqldump --compatible=postgresql ...
9
ответ дан 1 December 2019 в 04:58
поделиться

Существует одна часть программного обеспечения платы, перечисленного на этой postgresql странице: http://www.postgresql.org/download/products/1

и это находится на pgFoundry: http://pgfoundry.org/projects/mysql2pgsql/

0
ответ дан 1 December 2019 в 04:58
поделиться

Взгляните на Литейный завод Пг , дополнительные утилиты для Пост-ГРЭС имеют тенденцию жить там. Я полагаю, что инструмент, который Вы ищете, действительно существует все же.

-1
ответ дан 1 December 2019 в 04:58
поделиться

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

-2
ответ дан 1 December 2019 в 04:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: