Скрипт для автоматизации переноса колонок обычной таблицы в атрибуты REM-модели

Перед запуском скрипта

Нужно создать rem модель запроса

Что делает скрипт:
Заполняет поля
1 Container
2 Attribute Type
3 Title
4 Attribute Name
Если attribute type === 8 //reference
то заполняем
reference_id
Если attribute type === 2 // choice
то заполняем
default_value

const record = new SimpleRecord("sys_db_column");
const arrId = [];
record.addQuery('table_id', '')// Вставляем сюда нашу таблицу, пример 168726229224896075
record.addQuery('column_name', '!=', 'sys_updated_by'); // Системные поля нам не нужны
record.addQuery('column_name', '!=', 'sys_created_by');
record.addQuery('column_name', '!=', 'sys_updated_at');
record.addQuery('column_name', '!=', 'sys_created_at');
record.addQuery('column_name', '!=', 'sys_id');
record.query()
while (record.next()) {
  arrId.push(record.sys_id);
}
ss.info(arrId)
 
for ( let i = 0 ; i < arrId.length; i++) {
let columns = record.get( arrId[i])// Колонки
  getColumn();
function getColumn() {
    const attributes = new SimpleRecord("sys_re_attribute");
    attributes.re_container_id = ''// Вставляем сюда наш контейнер, пример 168752958821816852
    attributes.column_type_id = columns.column_type_id.sys_id
    attributes.title = columns.title
    attributes.column_name = 'rem_' + columns.column_name
    if (attributes.column_type_id.sys_id === 8) {
    attributes.reference_id = columns.reference_id.sys_id
     }
   if (attributes.column_type_id.sys_id === 2) {
    attributes.choice_type = 2
    attributes.default_value = columns.default_value
     }
   attributes.insert();// Делаем из данной колонки атрибут
 }
}
2 лайка

Интересный кейс, когда это требуется.
Не много оптимизировал Ваш код, по замерам, работает в 2 раза быстрее, возможно кому-то потребуется)

const TARGET_TABLE_ID = "155931135900000083"; // Вставляем сюда нашу таблицу, пример 168726229224896075
const TARGET_CONTAINER_ID = ""; // Вставляем сюда наш контейнер, пример 168752958821816852

const columns = new SimpleRecord("sys_db_column");
columns.addQuery("table_id", TARGET_TABLE_ID); // Вставляем сюда нашу таблицу, пример 168726229224896075
columns.addQuery("column_name", "NOT IN", EXCLUDED_COLUMNS);
columns.query();
while (columns.next()) {
    const attributes = new SimpleRecord("sys_re_attribute");
    attributes.re_container_id = TARGET_CONTAINER_ID;
    Object.keys(columns.getAttributes()).forEach((_) => {
        if (EXCLUDED_COLUMNS.includes(_)) return; //исключаем системные поля
        if (_ == "column_name") {
            attributes.column_name = `rem_${columns.column_name}`;
            return;
        }
        attributes[_] = columns.getValue(_);
    });
    attributes.insert();
}

2 лайка

Попробовал запустить.
В настоящем виде скрипт не работает.

Предоставьте текст ошибки, чтоб было понятней, что именно не работает

Поскольку не объявлена константа EXCLUDED_COLUMNS возникает ошибка “An internal server error occurred”.

Это я исправил.

Есть ошибка валидации:

В результате выполнения скрипта в модели не создаются атрибуты.

Исправил.

Нужно добавить константу:

const EXCLUDED_COLUMNS = ['sys_id', 'sys_created_by', 'sys_updated_by', 'sys_created_at', 'sys_updated_at', 'sys_db_table_id'];

Есть одно отличие от результата выполнения изначального скрипта: дублируются колонки в таблице, дубликаты имеют название ‘rem_[название дублируемой колонки]’ :

Действительно, переменная потерялась, форматирование съело первую строку)
По поводу комментария, эта версия скрипта должна поправить ситуацию.

const TARGET_TABLE_ID = '155931135900000083'; // Вставляем сюда нашу таблицу, пример 168726229224896075
const TARGET_CONTAINER_ID = ''; // Вставляем сюда наш контейнер, пример 168752958821816852
const REM_TABLE_ID = '999999999999999998';
const EXCLUDED_COLUMNS = [
    'sys_id',
    'sys_created_by',
    'sys_updated_by',
    'sys_created_at',
    'sys_updated_at',
    'sys_db_table_id',
    'table_id',
];

const columns = new SimpleRecord('sys_db_column');
columns.addQuery('table_id', TARGET_TABLE_ID); // Вставляем сюда нашу таблицу, пример 168726229224896075
columns.addQuery('column_name', 'NOT IN', EXCLUDED_COLUMNS);
columns.query();
while (columns.next()) {
    const attributes = new SimpleRecord('sys_re_attribute');
    attributes.re_container_id = TARGET_CONTAINER_ID;
    Object.keys(columns.getAttributes()).forEach((_) => {
        if (EXCLUDED_COLUMNS.includes(_)) return; //исключаем системные поля
        if (_ == 'column_name') {
            attributes.column_name = `rem_${columns.column_name}`;
            return;
        }
        attributes[_] = columns.getValue(_);
    });
    attributes.table_id = REM_TABLE_ID;
    attributes.insert();
}

Я так понимаю, что это поле можно не заполнять?
Для него ведь всё равно устанавливается значение ‘999999999999999998’.

Если стоит default_value, то да, явно в скрипте можно не заполнять.