LOAD DATA FROM S3 ложно возвращает ошибку в методе запроса codeigniter - PullRequest
0 голосов
/ 31 августа 2018

Я размещаю приложение codeigniter на AWS, и один метод в этом приложении запускает

"LOAD DATA FROM S3 'S3 path' ... "

По сути, это то же самое, что и запрос LOAD DATA INFILE, но оно настроено в AWS Aurora для чтения файлов из S3 вместо локального тома. Запрос выполняется должным образом, но CI

$this->db->error()

возвращает массив, указывающий, что произошла ошибка. Содержимое этого массива

[0, '']

Сначала я подумал, что это тайм-аут, но после уменьшения размера импортируемого файла и проверки того, что записи были импортированы, я начал подозревать, что драйвер БД CI не предназначен для обработки результата этого запроса. Запрос на самом деле не возвращает никаких данных, и я думаю, это сбивает с толку CI.

Есть ли какой-нибудь хороший способ обойти это поведение в CI, не изменяя фреймворк "исходный код"?

Заранее спасибо!

1 Ответ

0 голосов
/ 04 сентября 2018

Я понял, что, поскольку класс драйвера БД с именем MySQLi возвращает следующее значение для $this->db экземпляра в модели (см. Атрибуты errno и error)

[_mysqli:protected] => mysqli Object
    (
        [affected_rows] => 1
        [client_info] => mysqlnd 5.0.12-dev - 20150407 - $Id: b382534eeb34d9ed79345235b8bae2234b287afcs21ad4e $
        [client_version] => 50012
        [connect_errno] => 0
        [connect_error] => 
        [errno] => 0
        [error] => 
        [error_list] => Array
            (
            )

Я никогда не получу больше информации об ошибке, чем то, что mysql_errno и mysql_error возвращает водителю. Так что вместо этого, если ошибка проверки запроса, как этот

if($this->db->error())
{
    return false;
}

Я могу просто сделать это

if(is_array($this->db->error()) && 0 !== $this->db->error()[0])
{
    return false;
}

Ошибки возвращаются в формате массива или false из $this->db->error(), и поэтому очень просто проверить, равен ли код ошибки нулю. Если оно равно нулю, мы можем предположить, что запрос выполнен как запланировано, и что импорт завершен. Причина, по которой мы получаем массив вместо false из $ this-> db-> error (), заключается в том, что из запроса, который ожидает CI, не было получено никакого результата.

Так что ... простое решение в конце концов.

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