Laravel 用の Cloud Spanner ドライバを公開しました

Hiroki Awata
google-cloud-jp
Published in
4 min readFeb 21, 2019

株式会社コロプラの粟田です。前回は PHP ではじめる Cloud Spanner という記事を書き、Cloud Spanner に接続する最小限のコードを紹介しました。

しかし、実際に PHP でアプリケーションを開発する際はフレームワークを用いることがほとんどだと思います。例えば弊社では Laravel というフレームワークを導入しています。

Laravel は MySQL や PostgreSQL などの RDBMS に標準で対応していますが、Cloud Spanner はありません。そこで新たに Cloud Spanner 対応のためのパッケージを開発し、オープンソースとして公開しました。

colopl/laravel-spanner の特徴

  • Cloud Spanner に対して Laravel データベースのほとんどの機能が利用可能
  • Eloquent 対応
  • インターリーブされたテーブル・インデックスの作成が可能
  • ゲームサーバーでの使用実績あり

導入方法

基本的に README の通りです。Cloud Spanner に接続可能な PHP の環境であれば、Laravel のデータベース設定ファイルで driver を spanner にすることですぐに使い始めることができます。

composer require colopl/laravel-spanner

設定ファイルは次のようになります。

'spanner' => [
'driver' => 'spanner',
'instance' => '<Spanner instance id>',
'database' => '<Spanner database name>',
]

導入時の注意点

基本的には他の Laravel 対応データベースと同じように扱うことができますが、注意すべき点があります。その中からいくつか大きいトピックをここで解説します。(他の細かな情報等は README に記載しています。)

AUTO INCREMENT が存在しない

Primary key を自動的に連番で挿入してくれる AUTO INCREMENT 機能は Cloud Spanner には存在しません。Cloud Spanner ではそもそも連番のキーはアンチパターンであり、先頭が分散するキーが推奨されています。

そのため、AUTO INCREMENTに依存した機能は動作しません。たとえばマイグレーションの機能であったり、Eloquent の belongsToMany 等が当てはまります。

スキーマの変更が遅い

Cloud Spanner は既存のデータベースに対するスキーマの変更に非常に時間がかかります。Schema ファサードなどのテーブルやインデックスの変更を行う機能を使った場合は待ち時間が長くなる可能性があります。

回避策として、Connection クラスに用意したcreateDatabase($statements) メソッドを用いてデータベースごと初期化する方法があります。引数の $statements に DDL を配列で渡すことで初期化と同時にテーブルやインデックスを作ることができます。

$ddls = [
'CREATE TABLE ...',
'ADD INDEX ...',
];

DB::connection()->createDatabase($ddls);

今後の予定

Cloud Spanner は比較的新しいサービスであり、機能もこれから追加されていくことが予想されます。それにあわせて laravel-spanner も更新していく予定です。

要望やバグ報告などありましたら GitHub issues にあげていただければ幸いです!

--

--