Загрузка массива целиком на лист
Есть реализации загрузки на лист из базы msql построчно:
function readDatatest() {
// Выгрузка баз на страницы --------------------------------------------
var conn = Jdbc.getConnection(url, username, password);
var stmt = conn.createStatement();
var results = stmt.executeQuery('SELECT * FROM ' + "posts_info");
var metaData=results.getMetaData();//Получаем целую таблицу
var numCols = metaData.getColumnCount();// Количество столбцов
var spreadsheet = SpreadsheetApp.getActive();
var sheet = spreadsheet.getSheetByName('test');
sheet.clearContents();// очищаем лист перед загрузкой
while (results.next()) {
arr=[];//создаём пустой массив
for (var col = 0; col < numCols; col++) {
arr.push(results.getString(col + 1));
}
sheet.appendRow(arr);
}
}
Подскажите пожалуйста как реализовать выгрузку целую базу, через массив (не построчно) Спасибо!
Ответы (2 шт):
Не уверен, но по-моему у этого коннектора нет дампа, а только курсор. Поэтому только так
function readDatatest() {
// Выгрузка баз на страницы --------------------------------------------
var conn = Jdbc.getConnection(url, username, password);
var stmt = conn.createStatement();
var results = stmt.executeQuery('SELECT * FROM ' + 'posts_info');
var metaData = results.getMetaData(); // Получаем информацию о таблице
var numCols = metaData.getColumnCount(); // Количество столбцов
var spreadsheet = SpreadsheetApp.getActive();
var sheet = spreadsheet.getSheetByName('test');
sheet.clearContents(); // очищаем лист перед загрузкой
const data = []; // Данные для вставки
while (results.next()) {
const row = []; // создаём пустой массив
for (var col = 0; col < numCols; col++)
arr.push(results.getString(col + 1));
data.push(row);
}
if (data.length)
sheet.getRange(1, 1, data.length, data[0].length).setValues(data);
}
Возможно, у вас слишком большой набор данных, попробуйте выбирать данные частично, напримр построчно по 1000 строк
SELECT * FROM table ORDER BY ID LIMIT 1, 1000
следующий запрос
SELECT * FROM table ORDER BY ID LIMIT 1001, 1000
и т.д.
Не думаю, что это как-то ускорит общее положение дел, но вы сможете избежать рутины в загрузке предыдущих данных.
аналогично искал решение по выгрузке данных из MySQL через JDBC, метода загрузить массив я не нашел, но можно получать сразу всю строку в виде объекта JSON. Это несколько ускоряет.
Посмотрите в сторону JSON_OBJECT и JSON_ARRAY, если данных не очень много, то можно с помощью JSON_ARRAY получать за 1 запрос всю информацию, затем уже с ним работать.
Если данных много, то можно получать данные частями (если времени скрипта не хватает на выполнение). Суть заключается в том, чтобы записать в таблицу последний элемент (порядковый номер или ID и т.п.) на который успел обработать скрипт и создать тригер на повторный запуск скрипта.
При повторном запуске скрипта, получаем из таблицы значение на чем остановились и продолжаем, если данные все обработаны на последней итерации в таблицу фиксации итераций вносим соответствующую информацию и триггер на запуск нового уже не запускаем. Возможно, это не совсем точно, но суть думаю Вы поняли.
Мой пример работы с mysql с помощью JSON_OBJECT
function jdbc_sinc_id_files() {
//Запрос к БД
const queryStr = `SELECT JSON_OBJECT('download_id', download_id, 'filename', filename, 'mask', mask) FROM oc_download`;
//Отправляем запрос к БД
let resp = jdbcQuery(queryStr);
//Записываем в переменную массив данных из БД
let arrResult = resp.arrResult;
}
function jdbcQuery(query) {
//Устанавливаем соединие с БД
let stmt = jdbcMysqlConnect();
//Лимит результатов
// stmt.setMaxRows(10);
//Дата и время начала операции для отслеживания времени работы скрипта
var start = new Date();
//Объект с результатами
let result = {};
//Время начала
result.start = start;
//Запрос на SQL к БД
var rs = stmt.executeQuery(query);
//Временная точка - фиксируем выполнение запроса
var end = new Date()
//Выводим время в лог
Logger.log('Время выполнения запроса: %ss', (end - start) / 1000);
//Создаем переменную для записи результатов в цикле из БД
let resultJSON;
//Создаем пустой массив для результатов
let arrResult = [];
let i = 0;
//В цикле получаем из БД каждую строку в запросе
while (rs.next()) {
resultJSON = rs.getString(1); //Получаем строку из БД в формате JSON
resultJSON = JSON.parse(resultJSON); //Парсим JSON (return Object)
if (!i) {//Если это первая итерация цикла (i=0), то
arrResult.push(Object.keys(resultJSON).reverse()); //Добавляем в массив заголовки из Ключей объекта
i++ //Инкременируем счётчик
}
arrResult.push(Object.values(resultJSON).reverse()) //Добавляем значения ключей в массив результатов
}
//Добавляем к объекту массив с результатами
result.arrResult = arrResult
//Временная точка - фиксируем время чтения данных из БД
var end = new Date();
Logger.log(`Массив получен, времени прошло с начала: ${(end - start) / 1000}s, прочинано строк ${arrResult.length}`);
rs.close();
stmt.close();
return result
}