Задать вопрос
@termospa

Запрос на создание таблицы в clickhouse Yandex выдает ошибку 400 Bad Request, что не так с моим запросом?

Добрый день знатоки!
Запросы на получение данных работают, а вот создать таблицу в clickhouse не получается
Права на создание таблицы есть (проверял в песочнице и в аккаунте)
Ниже привету код, взят из официальной документации, заменил только метод POST и 2 последних заголовка в $auth

$query_create_table = "CREATE TABLE `iiko-db`.test_sales (Delivery_IsDelivery String) ENGINE = MergeTree() ORDER BY (Delivery_IsDelivery);";

    $host = '******.mdb.yandexcloud.net';
    $db = '****';

    $auth = [
        'X-ClickHouse-User:******',
        'X-ClickHouse-Key:******',
        'Transfer-Encoding: chuncked',
        'Content-Length:' . strlen($query_create_table),
    ];

    $ssl = [
        'cafile' => '/usr/local/share/ca-certificates/Yandex/RootCA.crt',
        'verify_peer' => true, 
    ];

    $context = stream_context_create([
        'http' => [
            'method' => 'POST',
            'protocol_version' => 1.1,
            'header' => $auth
        ],
        'ssl' => $ssl
    ]);

    $url = sprintf('https://%s:8443/?database=%s&query=%s', $host, $db, urlencode($query_create_table));

    $rs = file_get_contents($url, false, $context);
    echo "<pre>";
    print_r($rs);
    echo "</pre>";


На выходе получаю

Warning: file_get_contents(https:/*****.mdb.yandexcloud.net:8443/?database=iiko-db&query=CREATE+TABLE+%60iiko-db%60.test_sales+%28Delivery_IsDelivery+String%29+ENGINE+%3D+MergeTree%28%29+ORDER+BY+%28Delivery_IsDelivery%29%3B): Failed to open stream: HTTP request failed! HTTP/1.1 400 Bad Request in /index.php on line 119
  • Вопрос задан
  • 264 просмотра
Подписаться 1 Простой 2 комментария
Помогут разобраться в теме Все курсы
  • Skillbox
    Веб-разработчик на PHP
    9 месяцев
    Далее
  • Хекслет
    PHP-разработчик
    10 месяцев
    Далее
  • Stepik
    Язык программирования PHP
    1 неделя
    Далее
Пригласить эксперта
Ответы на вопрос 4
ipatiev
@ipatiev Куратор тега PHP
Потомок старинного рода Ипатьевых-Колотитьевых
Как правильно меня поправили товарищи ниже, чтобы увидеть ответ сервера ,в котором может содержаться более подробное сообщение об ошибке, надо в контекст, в секцию http добавить элемент 'ignore_errors' => true,

Плюс совсем уж очевидные косяки, которые бросаются в глаза:
1. Нет такого слова - "chunck"
2. У этого запроса нет контента. И, как следствие - у него нулевая длина (и непонятно, зачем заголовок вообще).
2. Если метод POST, то логичнее отправлять данные не в строке запроса, а в теле запроса (но тогда и длину считать нормально, а не одной переменной, как сейчас).
4. Если уж посылать враскоряку - методом POST, но в строке запроса - то данные надо форматировать по стандарту, а не то что сейчас:
$url = sprintf('https://%s:8443/?%s', 
    $host, 
    http_build_query(['database'=>$db, 'query'=>$query])
);
Ответ написан
Комментировать
2ord
@2ord
1.
Content-Length:
странное двоеточие?! Fullwidth Colon - а не AI ли написал?
2. не нужен ли пробел после двоеточия?
3. Сертификат SSL действителен ли и доступен для чтения?
4. а точно ли 'method' => 'POST' ?
5. Стоит вывести строку в вывод и проверить корректен ли адрес. Попробовать использовать curl -i.
6. попробовать curl с путем /ping для проверки связи и отладки. А когда все будет хорошо, перейти к отладке создания таблицы.

Я не специалист в PHP, но разве нет в языке лучшего HTTP клиента, чем file_get_contents? Тот, который возвращает код, заголовки и пр.?
Ответ написан
@Vitsliputsli
file_get_contents не для этих целей. Не хотите использовать готовое решение для подключения к Клику, используйте хотя бы curl, чтобы получить нормальный ответ с описанием ошибки.
Без описания ошибки можно только гадать, что не так, а это непродуктивно, сегодня решите, а завтра будет новая ошибка и снова гадание.
Ответ написан
@termospa Автор вопроса
Решил попробовать curl
Код ниже
<?php

$data = 'CREATE TABLE `iiko-db`.test_sales (Delivery_IsDelivery String) ENGINE = MergeTree() ORDER BY (Delivery_IsDelivery);';		
 
$ch = curl_init('https://****.mdb.yandexcloud.net:8443');
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json', 'X-ClickHouse-User:****', 'X-ClickHouse-Key:****'));
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data, JSON_UNESCAPED_UNICODE)); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HEADER, false);
$res = curl_exec($ch);
curl_close($ch);
 
$res = json_encode($res, JSON_UNESCAPED_UNICODE);
print_r($res);
?>


На это раз получил расширенные данные об ошибке. от clickhouse.

"Code: 62. DB::Exception: Syntax error: failed at position 1 ('\"CREATE TABLE `iiko-db`.test_sales (Delivery_IsDelivery String) ENGINE = MergeTree() ORDER BY (Delivery_IsDelivery);\"'): \"CREATE TABLE `iiko-db`.test_sales (Delivery_IsDelivery String) ENGINE = MergeTree() ORDER BY (Delivery_IsDelivery);\". Expected one of: Query, Query with output, EXPLAIN, EXPLAIN, SELECT query, possibly with UNION, list of union elements, SELECT query, subquery, possibly with UNION, SELECT subquery, SELECT query, WITH, FROM, SELECT, SHOW CREATE QUOTA query, SHOW CREATE, SHOW [FULL] [TEMPORARY] TABLES|DATABASES|CLUSTERS|CLUSTER|MERGES 'name' [[NOT] [I]LIKE 'str'] [LIMIT expr], SHOW, SHOW COLUMNS query, SHOW ENGINES query, SHOW ENGINES, SHOW FUNCTIONS query, SHOW FUNCTIONS, SHOW INDEXES query, SHOW SETTING query, SHOW SETTING, EXISTS or SHOW CREATE query, EXISTS, DESCRIBE FILESYSTEM CACHE query, DESCRIBE, DESC, DESCRIBE query, SHOW PROCESSLIST query, SHOW PROCESSLIST, CREATE TABLE or ATTACH TABLE query, CREATE, ATTACH, REPLACE, CREATE DATABASE query, CREATE VIEW query, CREATE DICTIONARY, CREATE LIVE VIEW query, CREATE WINDOW VIEW query, ALTER query, ALTER TABLE, ALTER TEMPORARY TABLE, ALTER DATABASE, RENAME query, RENAME DATABASE, RENAME TABLE, EXCHANGE TABLES, RENAME DICTIONARY, EXCHANGE DICTIONARIES, RENAME, DROP query, DROP, DETACH, TRUNCATE, UNDROP query, UNDROP, CHECK ALL TABLES, CHECK TABLE, KILL QUERY query, KILL, OPTIMIZE query, OPTIMIZE TABLE, WATCH query, WATCH, SHOW ACCESS query, SHOW ACCESS, ShowAccessEntitiesQuery, SHOW GRANTS query, SHOW GRANTS, SHOW PRIVILEGES query, SHOW PRIVILEGES, BACKUP or RESTORE query, BACKUP, RESTORE, INSERT query, INSERT INTO, USE query, USE, SET ROLE or SET DEFAULT ROLE query, SET ROLE DEFAULT, SET ROLE, SET DEFAULT ROLE, SET query, SET, SYSTEM query, SYSTEM, CREATE USER or ALTER USER query, ALTER USER, CREATE USER, CREATE ROLE or ALTER ROLE query, ALTER ROLE, CREATE ROLE, CREATE QUOTA or ALTER QUOTA query, ALTER QUOTA, CREATE QUOTA, CREATE ROW POLICY or ALTER ROW POLICY query, ALTER POLICY, ALTER ROW POLICY, CREATE POLICY, CREATE ROW POLICY, CREATE SETTINGS PROFILE or ALTER SETTINGS PROFILE query, ALTER SETTINGS PROFILE, ALTER PROFILE, CREATE SETTINGS PROFILE, CREATE PROFILE, CREATE FUNCTION query, DROP FUNCTION query, CREATE NAMED COLLECTION, DROP NAMED COLLECTION query, Alter NAMED COLLECTION query, ALTER, CREATE INDEX query, DROP INDEX query, DROP access entity query, MOVE access entity query, MOVE, GRANT or REVOKE query, REVOKE, GRANT, EXTERNAL DDL query, EXTERNAL DDL FROM, TCL query, BEGIN TRANSACTION, START TRANSACTION, COMMIT, ROLLBACK, SET TRANSACTION SNAPSHOT, Delete query, DELETE. (SYNTAX_ERROR) (version 24.8.14.39 (official build))\n"
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы