Предотвратить тайм-аут запроса MySQL в скрипте приложений - PullRequest
0 голосов
/ 08 ноября 2018

Интернет-магазин нашего клиента использует Opencart, в маркетинговых целях он хотел автоматически синхронизировать заказы Opencart с Google Sheets. Я изменил скрипт в листах Google для извлечения заказов клиентов за прошлый год (на основе https://www.transpacific -software.com / blog / opencart-to-google-docs-pull-and-sync-data-auto-through -скрипт и https://gist.github.com/pradeepbheron/e6129c9fd9bc74e814d0)

SQL-запрос:

SELECT order_id, firstname AS first_name, lastname AS last_name, 
email, date_added AS order_date, CONCAT("£", FORMAT(total,2)) 
order_value, payment_address_1 AS billing_address_1, 
payment_address_2 AS billing_address_2, payment_city AS 
billing_city, payment_postcode AS billing_postcode, 
payment_country AS billing_country, items_purchased FROM 
(
    SELECT order_id, firstname, lastname, email, date_added, 
    total, payment_address_1, payment_address_2, payment_city, 
    payment_postcode, payment_country 
    FROM ocbw_order 
    GROUP BY order_id
) AS A 
JOIN (
     SELECT order_id AS product_order_id, GROUP_CONCAT(name 
     SEPARATOR ", ") AS items_purchased 
     FROM ocbw_order_product 
     GROUP BY product_order_id
) AS B 
     ON A.order_id=B.product_order_id 
     WHERE date_added >= DATE_SUB(NOW(),INTERVAL 1 YEAR) 
     AND firstname != ''

В phpMyAdmin он работает нормально, но Google Script Editor генерирует ошибку «Превышено максимальное время выполнения».

Похоже, что есть 7357 строк (экспортировано из myPhpAdmin). Есть ли лучший способ написать запрос? Также я пытаюсь переименовать заголовки столбцов, но могу только две работы, то есть:

GROUP_CONCAT(name SEPARATOR ", ") AS items_purchased 

и

CONCAT("£", FORMAT(total,2)) order_value

Любые мысли

БЫСТРОЕ ОБНОВЛЕНИЕ: пт 9 ноября 11:54:03 2018

1) По запросу @ThisGuyHasTwoThumbs приведен скриншот результата таблицы объяснения

enter image description here

2) Я заглянул в документ Best Practices, упомянутый @bcperth. Я попытался переписать скрипт google листов, но столкнулся с проблемами.

Вот исправленный скрипт.

function p1MySQLFetchData() { 

    // Change it as per your database credentials
    var conn = 
    Jdbc.getConnection('jdbc:mysql://[dbHostIp]:3306/[dbName]', 
    '[dbUsername]', '[dbPassword]'); 

    var stmt = conn.createStatement();
    var start = new Date(); // Get script starting time

    //change table name as per your database structure
    var rs = stmt.executeQuery('[sqlQuery]'); 
    // It sets the limit of the 
    // maximum nuber of rows in a ResultSet object

    // Returns the currently active spreadsheet
    var doc = SpreadsheetApp.getActiveSpreadsheet(); 
    var cell = doc.getRange('a1');
    var row = 0;

    // Mysql table column name count.
    var getCount = rs.getMetaData().getColumnCount(); 

    // Create array to hold mysql data
    var tempArray = []; 

    // get row and column count for later
    var colCount = getCount;

    // ATTEMPT TO GET ROW COUNT 1 
    //rs.last();
    //var rowCount = rs.getRow();
    //rs.beforeFirst(); // resets rs cursor
    //Logger.log(RowCount); 
    // DOESN'T WORK! result => ReferenceError: "RowCount" is not 
    // defined. (line 28, file "Code")

    // ATTEMPT TO GET ROW COUNT 2
    //var rsCount = stmt.executeQuery('SELECT COUNT(*) AS rowcount FROM 
    //[sqlQuery]); 
    // It sets the limit of the maximum number of rows in a ResultSet 
    // object
    //rsCount.next();
    //var rowCount = rsCount.getString("rowcount");
    //Logger.log(rowCount); 
    // DOESN'T WORK!  result => 0


    // Build TempArray using MySQL data
    for (var i = 0; i < getCount; i++){ 
        tempArray[0][i] = rs.getMetaData().getColumnName(i+1); 
        // DOESNT WORK => ERROR 
        // TypeError: Cannot set property "0.0" of undefined to "order_id". 
        // (line 39, file "Code")
        //Logger.log(rs.getMetaData().getColumnName(i+1));
    }  

    var row = 1; 
        while (rs.next()) {
           for (var col = 0; col < rs.getMetaData().getColumnCount(); 
           col++) { 
                tempArray[row][col] = rs.getString(col + 1);
                //Logger.log(rs.getString(col + 1));
            }
        row++;
    }

    // BELOW DOESNT AS I CANT GET A ROW COUNT (SEE ABOVE)
    // Fill Spreadsheet from tempArray 
    //for (var row = 0; row < rowCount; row++) {
        //for (var col = 0; col < colCount; col++) {
            //cell.offset(row, col).setValue(tempArray[row][col + 1]);
        //}
    // }

    rs.close();
    stmt.close();
    conn.close();
    var end = new Date(); // Get script ending time
    Logger.log('Time elapsed: ' + (end.getTime() - start.getTime())); 
    // To generate script log. To view log click on View -> Logs.
}

Но, как вы можете видеть из комментариев, я получаю массу ошибок. Не уверен, что делать дальше.

ОБНОВЛЕНИЕ Пт 30 ноября 15:26:14 2018

В ответ на комментарий @Tedinoz ниже.

PhpMyAdmin генерирует 6862 результатов, а запрос занял 13.3074 секунды.

Когда я запустил скрипт в редакторе скриптов Googles, его выполнение заняло около 2 минут 30 минут и извлекает только 6348 записей (92,5%). Записи прекращаются после 3 октября 2018 года.

Относительно ваших предложений:

1) Я попытался запустить модифицированный скрипт, установив ИНТЕРВАЛ на:

  • 1 МЕСЯЦ => Я не получаю результатов в Google (должно быть 529)
  • 2 МЕСЯЦА => Я получаю 14 результатов (должно быть 1029)
  • 3 МЕСЯЦА => Я получил 299 результатов (должно быть 1669).

Все они заняли около 4-7 секунд в myPhpAdmin против 5–20 секунд в Google Script Editor

2) Вы имеете в виду экспорт CSV из phpMyAdmin и импорт в Google Sheets? Ну, я сделал это, и все работает отлично.

Еще одна вещь, которую я заметил, это то, что order_id в Google Sheets не совпадает с phpMyAdmin. Weird.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...