0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

SQLiteのDBをWebAPIにするnpx cliツールを作った

Last updated at Posted at 2023-12-30

フロントエンドの実験中や、開発の初期の初期、PoCの段階などで、DBを使いたいんだけどバックエンドを書くのめんどくさいってこと、ないでしょうか。私は割とあります。
そこで、SQLiteのDBを即席WebAPIにする開発用ツールを作りました。

npm

GitHub

Usage

  • npxで一撃です。
npx apifi-sqlite ./hoge.db 3000
  • このコマンドを実行すると、hoge.dbのテーブルごとに、http://localhost:3000/以下にエンドポイントが生えます。
  • ポートは省略可能で、デフォルトは3000です。
  • http://localhost:3000/にアクセスすると、APIのリストが雑に出ます。
    • ほんとはSwaggerみたいに出せればよかったのですが、そこまでするモチベーションがなかった。

サンプルDBをAPI化してみる。

  • なんでもいいですが、私がよく使うSQLiteのサンプルDBはこれ。

npx apifi-sqlite ./chinook.db
するとこんな感じでAPIが生えます。
Server is running on http://localhost:3000
- GET : http://localhost:3000/albums
- DELETE : http://localhost:3000/albums
- POST : http://localhost:3000/albums
- PUT : http://localhost:3000/albums
- GET : http://localhost:3000/sqlite_sequence
- DELETE : http://localhost:3000/sqlite_sequence
- POST : http://localhost:3000/sqlite_sequence
- PUT : http://localhost:3000/sqlite_sequence
- GET : http://localhost:3000/artists
- DELETE : http://localhost:3000/artists
- POST : http://localhost:3000/artists
- PUT : http://localhost:3000/artists
- GET : http://localhost:3000/customers
- DELETE : http://localhost:3000/customers
- POST : http://localhost:3000/customers
- PUT : http://localhost:3000/customers
- GET : http://localhost:3000/employees
- DELETE : http://localhost:3000/employees
- POST : http://localhost:3000/employees
- PUT : http://localhost:3000/employees
- GET : http://localhost:3000/genres
- DELETE : http://localhost:3000/genres
- POST : http://localhost:3000/genres
- PUT : http://localhost:3000/genres
- GET : http://localhost:3000/invoices
- DELETE : http://localhost:3000/invoices
- POST : http://localhost:3000/invoices
- PUT : http://localhost:3000/invoices
- GET : http://localhost:3000/invoice_items
- DELETE : http://localhost:3000/invoice_items
- POST : http://localhost:3000/invoice_items
- PUT : http://localhost:3000/invoice_items
- GET : http://localhost:3000/media_types
- DELETE : http://localhost:3000/media_types
- POST : http://localhost:3000/media_types
- PUT : http://localhost:3000/media_types
- GET : http://localhost:3000/playlists
- DELETE : http://localhost:3000/playlists
- POST : http://localhost:3000/playlists
- PUT : http://localhost:3000/playlists
- GET : http://localhost:3000/playlist_track
- DELETE : http://localhost:3000/playlist_track
- POST : http://localhost:3000/playlist_track
- PUT : http://localhost:3000/playlist_track
- GET : http://localhost:3000/tracks
- DELETE : http://localhost:3000/tracks
- POST : http://localhost:3000/tracks
- PUT : http://localhost:3000/tracks
- GET : http://localhost:3000/sqlite_stat1
- DELETE : http://localhost:3000/sqlite_stat1
- POST : http://localhost:3000/sqlite_stat1
- PUT : http://localhost:3000/sqlite_stat1

GET

  • 生えたエンドポイントをGETで叩くと、そのテーブルの中身をJSON配列で返します。
  • GET - http://localhost:3000/albums

SQL

SELECT * FROM albums

レスポンス

[
  {"AlbumId":1,"Title":"For Those About To Rock We Salute You","ArtistId":1},
  {"AlbumId":2,"Title":"Balls to the Wall","ArtistId":2},
... // 長いので省略
]
  • Where句での絞り込みは、クエリ文字列で渡します。
  • GET - http://localhost:3000/albums?AlbumId=1

SQL

SELECT * FROM albums WHERE AlbumId = 1

レスポンス

[
  {"AlbumId":1,"Title":"For Those About To Rock We Salute You","ArtistId":1}
]
  • クエリ文字列は、?{field},{operator}={value}&...の形式で指定します。
    • 条件は複数使えますが、全てandになります。
      • orに対応しようとするとガチャガチャするかなと思って、一旦割り切りました。
  • GET - http://localhost:3000/albums?AlbumId,in=1,2,3,4,5&Title,like=the

SQL

SELECT * FROM albums WHERE AlbumId in (1,2,3,4,5) AND Title Like '%the%'

レスポンス

[
  {"AlbumId":2,"Title":"Balls to the Wall","ArtistId":2},
  {"AlbumId":4,"Title":"Let There Be Rock","ArtistId":1}
]
  • 演算子はeq(equals)ne(not equals)innotinlikenotlikegt(greater than)ge(greater equal)lt(lesser than)le(lesser equal)が指定できます。

POST

  • 生えたエンドポイントをPOSTで叩くと、そのテーブルにINSERTを流します。
  • リクエストbodyに{field: value}のようなJSON形式で、データを渡してあげます。
  • POST - http://localhost:3000/albums
// content-type: application/json
{
    "AlbumId" : 400,
    "Title" : "Albmus for Testing",
    "ArtistId" : 1
}

SQL

INSERT INTO albums (AlbumId,Title,ArtistId) VALUES (400, 'Albums for Testing', 1)

レスポンス

  • 新しいIDが帰ってきます。
400

PUT

  • 生えたエンドポイントをPUTで叩くと、そのテーブルにUPDATEを流します。
  • これも、リクエストbodyに {field: value}の形で、データを渡してあげます。
  • ちゃんとクエリ文字列でWhere句を書いてあげないと、全部上書きするので注意が必要。
  • PUT - http://localhost:3000/albums?AlbumId=400
// content-type: application/json
{
  "Title" : "Albums for Testing 2"
}

SQL

UPDATE albums SET Title = 'Albmus for Testing 2' WHERE AlbumId = 400

レスポンス

  • 更新されたデータの件数が返ってきます。
1

DELETE

  • 生えたエンドポイントをDELETEで叩くと、そのテーブルにDELETEを流します。
  • ちゃんとクエリ文字列でWhere句を書いてあげないと、全部消しますので注意。
  • DELETE - http://localhost:3000/albums?AlbumId=400

SQL

DELETE FROM albums WHERE AlbumId = 400

レスポンス

  • 削除されたデータの件数が返ってきます。
1

おわりに

  • フロントエンドの実験をする時に、めんどくさくてGitHubのAPI叩いたりしてたのですが、もうちょっと実態に即したデータで試したいなぁ、ということで作りました。
    • 機能が限定的だったり、エラーハンドリングが雑でなんのエラーだかわからなかったり、まだまだ改善の余地はありますが、自分の開発用ツールとしてはまずまず便利に使えるものができました。
    • 「欲しいものはある程度自分で作れる」のがプログラマーという職業のいいところです。

Appendix:依存ライブラリについてのメモ

  • Express - Web APIの構築
  • EJS - APIリストを表示するために使用
  • Jest - テスト
  • supertest - Express.jsのテスト用
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?