kintoneのクエリを型安全に生成、パースできるライブラリを試験公開しました。

お疲れ様です。

皆様はkintoneのクエリを組み立てる際どうしていますか?

生のクエリをそのまま記述したり、kintone-query-builderライブラリを使用したりするのが一般的かなと思います。

しかし、どちらの方法もあまりTypeScriptの型の恩恵を得られるものではなく、結局クエリ文法を理解し、間違わずに書く能力が求められます。

そこで、前回作成したEffect Schemaを利用して、CLIによりアプリのフィールド定義を入手し、それを用いて型安全にコード上でクエリを組み立てることができるツールを作りました。これにより、存在しないフィールドや使用不可能な演算子、本来取れない引数等が型エラーとなり、クエリの安全性が向上します。

現在、使用感の雰囲気を見るための試験公開とさせていただいております。内部ロジックがガタガタなので。クエリの書き方自体は大きく変えないでいきたいと考えていますが、もしご意見ご感想等ございましたらコメントいただけると幸いです。

取り急ぎこんなものでしょうか。あとで時間のあるときに文面を編集するかもしれません。

「いいね!」 4

私は、

kintone.app.getQueryCondition()

を利用しています。

ブラウザUIのフィルターでクエリを作って、その内容をコピーしてプログラムに取り込んでいます。

一部をプログラムの変数に置き換えて、出力結果をチェックしたりしています。kintoneのAPIのエラー表示がもう少しなんとかなればなとは思います。

レコード一覧のクエリ文字列を取得する - cybozu developer network

「いいね!」 1

クエリ取得メソッドは便利ですよね。

ただ、ブラウザUIのフィルターってあれですよね。アプリの一覧画面の漏斗マークのやつ。あれ微妙にクエリが本来扱えるAND OR条件を扱いきれていないのが少し気になる部分かなと思っています。

一応このライブラリを使えば、実行して出力結果をチェックする前にクエリが文法的に正しいことが保障されるので、「クエリが不正です」と言われて見返すような場面は減るはずです。TypeScript前提ではありますが

「不正なJSON文字列です」みたいなどこがダメなのかわからないレスポンスをもらって首を傾げるの、多分全員通る道ですよね笑 色々多分セキュリティの関係等もあって詳細を教えてくれるようになる気はしないんですが、あまりいい開発体験ではないのも確か。

「いいね!」 1

一応 ANDOR を組み合わせてリクエストを投げることは避けたほうが良いとされているので、基本機能の絞り込みで出てきたクエリを使うのはどちらかと言えば良いマナーだと言えると思います。

もちろん組み合わせが必要な場合は往々にしてあるので、100%従う必要はないと思います。


私もよく TypeScript を書きますが、最近は基本的には以下のように組み立てますね。即興で記憶で書いたから細かいところ間違ってるかもだけど……。

import { KintoneRestAPIClient } from "@kintone/rest-api-client";
const client = new KintoneRestAPIClient();

async function fetchXXXRecords(params: {
  userCode?: string | string[];
  department?: string | string[];
}): Promise<XXXData> {
  const condition = [
    params.userCode ? makeSingleStringQuery(params.userCode) : undefined,
    params.department ? makeSingleStringQuery(params.department) : undefined,
  ].filter(notNull).join(" and ");

  const records = await client.record.getAllRecords({
    app: X,
    condition,
  });

  return records.map(convertXXXRecordToData);
}

function makeSingleStringQuery(field: stringCode, value: string | string[]) {
  if (Array.isArray(value)) {
    return `${fieldCode} in ("${value.join('", "')}")`;
  } else {
    return `${fieldCode} = "${value}"`;
  }
}

流石に毎回これだけ書くと長すぎるので、一部を関数化したりライブラリ化したものを作りたいなぁと思いつつ、ブラックボックスになっちゃうし面倒なのでやってないですね。複数人で開発するので、できるだけ素の TypeScript に寄せておきたいというのも少しあります。

「いいね!」 2

普通に公式の方法でクエリを組み立てるのは当然いいマナーだと思います。

ここにlikeとかが出てきたり、TODAY()等の関数を使おうとしたりするとどんどん複雑になっていきますよね。

ブラックボックスになってしまうのは確かに嫌なんですが、プログラミング自体が自分の周りからしたらブラックボックスなので諦めるかないかなしみ。チームであれば確かに素のTypeScriptに寄せておけば周りも読めますもんね。

「いいね!」 1

非推奨にしました。