中くらいのデータベース欲しい問題
バッチ処理的なプログラムを作ると、データの入出力と永続化をどうするか考えなければなりません。
シンプルで小規模であればテキストファイル(CSV)を使い、複雑で大規模になるとデータベースを用意しますが、その間の「中くらいのプロジェクト」で頭を悩ませてきました。
テキストファイルだと物足りず、少し複雑になるたびプログラム記述が増えるが、わざわざデータベースを用意するほどでもない、みたいなケースです。私はどうもそういう機会が多いです。
Googleスプレッドシートをデータベースにする
そこでGoogleスプレッドシートを活用できないか考え、こんなNPMモジュールを開発しました。
モジュールをインストールすると、
pnpm add google-spreadsheet-tables
こんな感じで名前、年齢、性別、勤務先の列からなるスプレッドシートを入出力可能なデータベースとして利用し、Zodスキーマで型安全なプログラミングができます。
const { doc } = useWorksheetWithServiceAccountFile('スプレッドシートID', './service-account.json')
const userSchema = z.object({
名前: z.string(),
年齢: z.coerce.number(),
性別: z.enum(['男性', '女性', 'その他']),
勤務先: z.string().optional(),
})
const { get, patch, snapshot } = await useDocumentsSheet(
doc,
'ユーザー',
userSchema
)
const allUsers = await snapshot()
const aUser = await get(2)
await patch(2, { 年齢: 31, 勤務先: 'CompanyA' })
Googleスプレッドシートを使うとなると、OAuth2でアクセストークンを取得して…と遠回りな印象ですが、サービスアカウントとJSON鍵ファイルでも可能です。
仕事が捗る!
Googleスプレッドシートを直接、簡易データベースにしてみると開発および作業体験が劇的に向上しました。
データが見やすい
幅を調整したり、フィルタをかけたりと自由にレイアウトや見た目を調整できるのでデータが見やすいです。
入力・調整・加工がしやすい
データを手作業で入力したり、ちょっと修正したり、カラムを追加して関数などで少し加工したりがすぐにできます。
分散処理できる
ローカルファイルだと分散処理が難しいですが、Googleスプレッドシートであれば簡単です。
前工程・後工程とシームレスに繋がる
何かのバッチ処理が単独で業務として成立することはほとんどなく、ふつうは前工程・後工程のある業務の一部です。
今まではバッチ処理用のCSVに変換したり、データベースに取り込む作業が発生していました。そして元データに修正が入ったりすると、それもマージしなければいけなかったり…
受け取ったデータをそのまま処理に回し、できあがったデータをそのまま次に渡せるのが最大のメリットでした。
どんどん使っていきたい
今までバッチ処理のアイデアがあっても、データ管理どうするかな…と億劫になることがありましたが、Googleスプレッドシートを直接データベースにするアイデアでその心配がなくなりました。
今度からは小規模なバッチ処理案件でも、積極的に使っていきたいなと思っています。