Как использовать Афину с Laravel? - PullRequest
1 голос
/ 25 марта 2019

Мы ищем, чтобы конкретная страница поиска / агрегата / графиков использовала AWS Athena вместо Postgres.

Мы перепробовали 2 пакета ODBC для laravel и обнаружили, что Laravel использует подготовленные операторы, а драйвер Simba ODBC от Athena не поддерживает подготовленные операторы. PDO поддерживает эмуляцию подготовленных операторов, что похоже на то, что будет работать, но включение ATTR_EMULATE_PREPARES не имеет значения.

Это ошибка, которую мы получаем:

Подсветка / База данных / QueryException с сообщением «SQLSTATE [42000]: синтаксическая ошибка или нарушение доступа: 0 [Симба] [Афина] (1040) Произошла ошибка из клиента AWS Athena. Ошибка Афины: 102, код ответа HTTP: 1, сообщение об ошибке: SYNTAX_ERROR: строка 1: 1: неверное число параметров: ожидается 1, но найдено 0 [ID выполнения:] (SQLPrepare [0] в /build/php7.2- PL0pac / php7.2-7.2.16 / ext / pdo_odbc / odbc_driver.c: 206) (SQL: выберите * из «qa_lines_csv», где «id»> 100 limit 1) '

Конфигурация нашей базы данных:

        'test_athena' => [
            'driver' => 'odbc',
            'dsn' => 'odbc:Driver=/opt/simba/athenaodbc/lib/64/libathenaodbc_sb64.so;'
                    .'AwsRegion=us-east-1;'
                    .'AuthenticationType=IAM Credentials;'
                    .'UID=<redacted>;'
                    .'PWD=<redacted>;'
                    .'S3OutputLocation=s3://<redacted>/;',
            'host' => env('ATHENA_HOST', 'localhost'),
            'port' => env('ATHENA_PORT', '5432'),
            'database' => env('ATHENA_DATABASE', 'forge'),
            'username' => env('ATHENA_USERNAME', 'forge'),
            'password' => env('ATHENA_PASSWORD', ''),
            'charset' => 'utf8',
            'prefix' => '',
            'schema' => 'public',
            'options' => [
                \PDO::ATTR_EMULATE_PREPARES => true,
            ],
$pdo = DB::connection('test_athena')->getPdo();

// this crashes
$pdo->prepare('select * from "qa_lines_csv" where "id" > ? limit 1')->execute([100]);

// this does not crash
$pdo->prepare('select * from "qa_lines_csv" where "id" > 100 limit 1')->execute([]);

// this crashes
DB::connection('test_athena')->table('qa_lines_csv')->where('id', '>', 100)->first()

Кажется, что есть ошибка между PDO и драйвером Simba, одна из которых не позволяет работать эмуляции PDO. Афина должна просто начать поддерживать подготовленные заявления.

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

...