1クール続けるブログ読者になる1クール続けるブログとりあえず1クール続けるソフトウェアエンジニアの備忘録この広告は、90日以上更新していないブログに表示しています。2021-05-23sqlcを利用してGoのDB周りの処理を扱う記事一覧はこちら背景・モチベーションsqlcとはsqlcを利用する方法sqlcのメリットdatabase/sqlパッケージを直接利用することのデメリットgormなどの高レベルライブラリを利用することのデメリットsqlcを実際使ってみての感想sqlcを実際に動かしてみる背景・モチベーション以前にsqlcの作者のブログ記事を読んだことがきっかけです。前におそらくredditで話題になっていたものを拾った気がします。見て開発生産性が上がりそうだなと思ったので試してみました。sqlcとはgithub.comSQLからtype-safeなコードを生成してくれるツールです。長い間、ソフトウェアエンジニアはプログラミング言語のアノテートされたオブジェクトからSQLのクエリを生成してきていました。SQLは既に構造化・型付けされた言語のため、SQL自体から正しいtype-safeなコードを生成すべきというのが、作者のモチベーションのようです。現在のところはPostgreSQLとMySQLのみをサポートしており、SQLiteも今後はサポート予定のようです。sqlcを利用する方法SQLを書きますsqlcを実行し、1.で作成したクエリに対するtype-safeなinterfaceを提供するGoのコードを生成しますsqlcが生成したメソッドをユーザのコードから呼びますsqlcのメリットコード生成をしている過程で、全てのクエリとDDL文を解析します。テーブルの列の名前や型が一致しない場合には、sqlcはクエリのコンパイルに失敗することで実行時エラーを未然に防ぐことができます。sqlcが生成するメソッドは厳密なGoの型定義を持つため、クエリの引数やカラムの型を変更した時にコードを更新しなければコンパイルに失敗するようになっています。安全ですね...!database/sqlパッケージを直接利用することのデメリットクエリが増えてくると、マッピングをメンテナンスするのが面倒になり生産性に大きな影響を与えます。良くない点として、下記の3点のような実行時まで気づけないミスを犯してしまう可能性があります。クエリのパラメータの順番を入れ替えた時に、マッピングの更新が漏れるテーブルにカラムが追加された時に、追加したカラムの値を返却するようにクエリを変更する作業に漏れが生じるSQLの方とコードの型に相違があるgormなどの高レベルライブラリを利用することのデメリット先程言及したdatabase/sqlパッケージを直接利用することのデメリットは解消されますが、クエリテキストやstructタグを使用して手動でのマッピングをせざるを得ず、間違った場合の実行時エラーが起こる可能性は大きくは減っていない状況と言えます。sqlcを実際使ってみての感想この後に動かしてみたことについて記載しますが、感想を先に述べておこうと思います。当初からサポートしているPostgresはともかく、MySQLはまだまだ実用には至れない状況だと思います。確認できた限りで下記のような未サポート/不具合があります(Issueに上がってなさそうなものは自分の方でIssue上げてみました)。同名の名前付きパラメータを別々に認識するsqlcを実際に動かしてみるサンプルのリポジトリは下記です。isucon10のisuumoの実装を参考にしながらsqlcを取り入れてみました。(謎のスイッチが入ってしまってDDDライクに作ってしまった...)github.comsqlcのバージョンはv1.8.0です。sqlcを実行するディレクトリ配下に置く設定ファイルの生成を行います。queriesとschemaで指定したディレクトリパスには、それぞれアプリケーション内で実行するSQLとテーブルを定義するSQLを格納しておきます。このpathパラメータの配下にファイルが生成されます。falseEOFそれでは、コードを生成していきます。generateを実行することでコードを生成することができます。syntaxにミスがある場合には、このときにエラーという形で確認できます。models.go定義したSQLと生成されたコードの一例としては下記のようになります。このGetChair()メソッドをアプリケーションから呼び出してデータベースから情報を取得します。拙いコードですが、上述のリポジトリでレコードのInsertや検索もやってみていますので、良かったら覗いてみてください。err}sqlcはとてもイケてるなと思うツールの反面、まだまだ枯れておらず実践で利用するのには難しい印象があります。OP...2020-05-20Accept-CharsetとContent-Typeの不一致でJerseyは404を返すかなりハマってしまったので残しておきたいと思います。3はてなブログをはじめよう!jrywm121さんは、はてなブログを使っています。ブログを報告する引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。