rexpl / libsql
Libsql 驱动,具有类似 PDO 的 API。
0.3.0
2024-03-20 19:15 UTC
Requires
- php: >=8.2
- phrity/net-uri: ^1.3
- phrity/websocket: ^2.1
- symfony/polyfill-mbstring: ^1.29
Requires (Dev)
- fakerphp/faker: ^1.23
- phpunit/phpunit: ^11.0
README
此库是一个 PHP 驱动,允许访问 libsql 数据库。
安装
composer require rexpl/libsql
示例
执行 SQL 查询
$libsql = new \Rexpl\Libsql\Libsql('libsql://127.0.0.1:8080', $token); $results = $libsql->query('SELECT * FROM users WHERE id = 1'); $user = $results->fetch(); // or $numberOfAffectedRows = $libsql->exec('UPDATE users SET email = "email@example.com" WHERE id = 1');
带有参数的 SQL 查询
$libsql = new \Rexpl\Libsql\Libsql('libsql://127.0.0.1:8080', $token); $results = $libsql->query('SELECT * FROM users WHERE id = ?', [$userId]); $user = $results->fetch(\Rexpl\Libsql\Libsql::FETCH_OBJ); // or with named arguments $query = $libsql->prepare('SELECT * FROM users WHERE email LIKE :email'); $results = $query->execute(['email' => '%@example.com']); $posts = $results->fetchAll(\Rexpl\Libsql\Libsql::FETCH_ASSOC);
在同一个连接上使用多个流
$firstStream = new \Rexpl\Libsql\Libsql('libsql://127.0.0.1:8080', $token); $secondStream = $firstStream->newStream(); $firstStream->beginTransaction(); var_dump($firstStream->inTransaction()); // true var_dump($secondStream->inTransaction()); // false
通过设置 token 为 null
和 secure 参数为 false
连接到本地 libsql 数据库
$libsql = new \Rexpl\Libsql\Libsql('libsql://127.0.0.1:8080', null, false);
批量查询
$libsql = new \Rexpl\Libsql\Libsql('libsql://127.0.0.1:8080', $token); $batch = $libsql->newBatch(); $batch->addStep('BEGIN TRANSACTION'); $userInsert = $batch->addStep('INSERT INTO users (name, email) VALUES (?, ?)', [$name, $email]); $insertOnSuccess = $batch->addConditionalStep( \Rexpl\Libsql\Batch\Condition::ok($userInsert), 'INSERT INTO users_log (action, email) VALUES ("insert_success", :email)', ['email' => $email] ); $insertOnFailure = $batch->addConditionalStep( \Rexpl\Libsql\Batch\Condition::error($userInsert), 'INSERT INTO users_log (action, email) VALUES ("insert_failed", :email)', ['email' => $email] ); $successCondition = \Rexpl\Libsql\Batch\Condition::or( \Rexpl\Libsql\Batch\Condition::ok($insertOnSuccess), \Rexpl\Libsql\Batch\Condition::ok($insertOnFailure) ); $batch->addConditionalStep($successCondition, 'COMMIT'); $batch->addConditionalStep(\Rexpl\Libsql\Batch\Condition::not($successCondition), 'ROLLBACK'); $getUserQuery = $batch->addStep('SELECT * FROM users WHERE email = ?', [$email]); $batchResults = $batch->execute(); $userInsertResults = $batchResults->getResultForStep($userInsert); // example: $userInsertResults->affectedRowCount(); // or $user = $batchResults->getResultForStep($getUserQuery)->fetch(\Rexpl\Libsql\Libsql::FETCH_OBJ);