keboola / query-api-php-client
Keboola Query Service API PHP Client
Installs: 652
Dependents: 0
Suggesters: 0
Security: 0
Stars: 0
Watchers: 0
Forks: 0
pkg:composer/keboola/query-api-php-client
Requires
- php: ^8.4
- ext-json: *
- guzzlehttp/guzzle: ~7.0
- psr/log: ^1.0|^2.0|^3.0
- symfony/validator: ^7.0
Requires (Dev)
- keboola/coding-standard: ^16.0
- keboola/storage-api-client: ^18.0
- phpstan/phpstan: ^2.0
- phpstan/phpstan-phpunit: ^2.0
- phpunit/phpunit: ^11.0
- squizlabs/php_codesniffer: ^3
- symfony/dotenv: ^7.0
- dev-main
- 1.0.0
- 0.6.0
- 0.5.0
- dev-devin/1760948558-query-api-client-pr-comments
- dev-devin/DMD-741-1761595185-unload-strategy
- dev-erik-AJDA-1087-single-job-v3
- dev-AJDA-1052-ondra
- dev-miro-AJDA-1167-2
- dev-miro-AJDA-1167
- dev-ms/dmd-431-fix-deduplication-strategy
- dev-sykorajiri-AJDA-586
- dev-zajca-event-grid
This package is auto-updated.
Last update: 2025-10-31 13:41:16 UTC
README
PHP client for Keboola Query Service API.
Installation
composer require keboola/query-service-api-client
Usage
Basic Usage - Submit and Wait for Results
<?php use Keboola\QueryApi\Client; $client = new Client([ 'url' => 'https://query.keboola.com', 'token' => 'your-storage-api-token' ]); // Execute query and wait for results (recommended) $response = $client->executeWorkspaceQuery('main', 'workspace-123', [ 'statements' => ['SELECT * FROM table1'], 'transactional' => true ]); // Get all results foreach ($response->getResults() as $statementResult) { $data = $statementResult->getData(); $columns = $statementResult->getColumns(); echo "Fetched " . $statementResult->getNumberOfRows() . " rows\n"; }
Advanced Usage - Manual Control
<?php use Keboola\QueryApi\Client; $client = new Client([ 'url' => 'https://query.keboola.com', 'token' => 'your-storage-api-token' ]); // Submit a query job $response = $client->submitQueryJob('main', 'workspace-123', [ 'statements' => ['SELECT * FROM table1'], 'transactional' => true ]); $queryJobId = $response->getQueryJobId(); // Get job status $statusResponse = $client->getJobStatus($queryJobId); $status = $statusResponse->getStatus(); // Get job results for first statement $statements = $statusResponse->getStatements(); $statementId = $statements[0]->getId(); $resultsResponse = $client->getJobResults($queryJobId, $statementId); $results = $resultsResponse->getData(); // Cancel job if needed $cancelResponse = $client->cancelJob($queryJobId, ['reason' => 'User requested cancellation']); $cancelledJobId = $cancelResponse->getQueryJobId();
Configuration Options
The client constructor accepts two parameters: $config array and $options array.
Config Array (required)
url(required): Query Service API URL (e.g.,https://query.keboola.com)token(required): Storage API token
Options Array (optional)
backoffMaxTries(optional): Number of retry attempts for failed requests (default: 3, range: 0-100)userAgent(optional): Additional user agent string to appendlogger(optional): PSR-3 logger instance for request/response loggingrunId(optional): Run ID to include in request headershandler(optional): Custom Guzzle handler stack
Example with options:
$client = new Client( ['url' => 'https://query.keboola.com', 'token' => 'your-token'], ['backoffMaxTries' => 5] );
API Methods
All public methods return dedicated Response objects with typed getters:
submitQueryJob(string $branchId, string $workspaceId, array $requestBody): SubmitQueryJobResponsegetQueryJobId(): string
getJobStatus(string $queryJobId): JobStatusResponsegetQueryJobId(): stringgetStatus(): string- Returns 'submitted', 'running', 'completed', 'failed', or 'canceled'getStatements(): Statement[]getCreatedAt(): stringgetChangedAt(): stringgetCanceledAt(): ?stringgetCancellationReason(): ?stringgetActorType(): string
getJobResults(string $queryJobId, string $statementId): JobResultsResponsegetData(): array- Returns data rows as associative arrays (column names as keys)getColumns(): arraygetStatus(): stringgetNumberOfRows(): intgetRowsAffected(): intgetMessage(): ?string
cancelJob(string $queryJobId, array $requestBody = []): CancelJobResponsegetQueryJobId(): string
executeWorkspaceQuery(string $branchId, string $workspaceId, array $requestBody, int $maxWaitSeconds = 30): WorkspaceQueryResponsegetQueryJobId(): stringgetStatus(): stringgetStatements(): Statement[]getResults(): JobResultsResponse[]- Returns results for all completed statements
waitForJobCompletion(string $queryJobId, int $maxWaitSeconds = 30): JobStatusResponse- Waits for job completion and returns the final status
Statement Object
Each Statement object provides the following getters:
getId(): stringgetStatus(): stringgetQuery(): stringgetQueryId(): ?stringgetSessionId(): ?stringgetNumberOfRows(): ?intgetRowsAffected(): ?intgetError(): ?stringgetCreatedAt(): ?stringgetExecutedAt(): ?stringgetCompletedAt(): ?string
Development
Running Tests
Unit Tests
Run unit tests:
vendor/bin/phpunit tests/ClientTest.php
Functional Tests
Functional tests require environment variables to be set:
STORAGE_API_TOKEN- Storage API authentication tokenHOSTNAME_SUFFIX- Hostname suffix (e.g.,keboola.com) - Query Service URL will be constructed ashttps://query.{HOSTNAME_SUFFIX}STORAGE_API_URL- Storage API endpoint URL
Run functional tests:
vendor/bin/phpunit tests/Functional/
All Tests
Run all tests:
composer run tests
Code Quality
Run code style check:
composer run phpcs
Fix code style issues:
composer run phpcbf
Run static analysis:
composer run phpstan
Run all CI checks. Check Github Workflows for more details
composer run ci