rexpl/libsql

Libsql 驱动,具有类似 PDO 的 API。

维护者

详细信息

github.com/rexpl/libsql

源代码

问题

安装: 7

依赖者: 0

建议者: 0

安全: 0

星标: 0

关注者: 1

分支: 0

开放问题: 0

类型:package

0.3.0 2024-03-20 19:15 UTC

This package is auto-updated.

Last update: 2024-09-20 20:26:25 UTC


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);