.../articles/

SchemaSpyのメタ情報をYAMLで書く

SchemaSpyにメタ情報を追加するmeta.xmlをYAMLで書いてから生成するようにしてみた。

プロジェクト内でデータベースの構造をシェアするためによく SchemaSpy を使うのですが、新しいメンバーやクライアントに見てもらうにはコメントがないと読み解いてもらうのは簡単ではありません。

これについて、SchemaSpyではデーターベースに直接情報がなくても追加でXMLファイルを記述すればテーブルやカラムに対してコメントを追加することができます。

このXMLファイル自体はそんなに複雑ではないものの書くのか若干面倒だなと思っていたので、YAMLで同等の情報を書いてそれを元に生成するようにしてみました。


セットアップ

以下の手順はRailsプロジェクトで動作を確認しています。

  • ruby: 2.6.5
  • Rails: 6.0.1

Rakeタスクを追加

RailsプロジェクトにRakeタスクとしてYAMLをパースしてXMLを生成する処理を追加します。

$ bundle exec rails g task meta_xml

これで生成された lib/tasks/meta_xml.rake を以下のように編集します。

require 'nokogiri'
require 'yaml'

namespace :meta_xml do
  desc 'meta.ymlからschemaspy用のmeta.xmlを生成'
  task generate: :environment do
    meta_yml_path = Rails.root.join('db/meta.yml')
    meta_yml = YAML.load_file(meta_yml_path).with_indifferent_access
    builder = Nokogiri::XML::Builder.new(encoding: 'UTF-8') do |xml|
      xml.schemaMeta('xmlns:xsi': 'http://www.w3.org/2001/XMLSchema-instance',
                     'xsi:noNamespaceSchemaLocation': 'http://schemaspy.org/xsd/6/schemameta.xsd') do
        xml.comments meta_yml[:comments]
        xml.tables do
          meta_yml[:tables].each do |table, props|
            xml.table(name: table, comments: props[:comments]) do
              props[:columns]&.each do |column, comments|
                xml.column(name: column, comments: comments)
              end
            end
          end
        end
      end
    end
    meta_xml_path = Rails.root.join('db/meta.xml')
    IO.write(meta_xml_path, builder.to_xml(indent: 2))
  end
end

YAMLを書く

例として以下のようなテーブルの情報を db/meta.yml に書いてみました。
usersテーブルとtodosテーブル、それぞれのカラムについてコメントを記述しています。

comments: サンプルプロジェクトのデータベース

tables:
  users:
    comments: ユーザーテーブル
    columns:
      id: ユーザーID
      email: メールアドレス
  todos:
    comments: TODOテーブル
    columns:
      id: TODO ID
      user_id: ユーザーID
      text: テキスト

XMLを出力

以上で bundle exec rake meta_xml:generate と実行すると db/meta.yml の内容を元に以下のような db/meta.xml を出力できるようになりました。

<?xml version="1.0" encoding="UTF-8"?>
<schemaMeta xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://schemaspy.org/xsd/6/schemameta.xsd">
  <comments>サンプルプロジェクトのデータベース</comments>
  <tables>
    <table name="users" comments="ユーザーテーブル">
      <column name="id" comments="ユーザーID"/>
      <column name="email" comments="メールアドレス"/>
    </table>
    <table name="todos" comments="TODOテーブル">
      <column name="id" comments="TODO ID"/>
      <column name="user_id" comments="ユーザーID"/>
      <column name="text" comments="テキスト"/>
    </table>
  </tables>
</schemaMeta>

あとはこれをSchemaSpyに読み込ませればOKです。

.../articles/

Articles

記事

AWS AmplifyにmonorepoのNext.js(App Router)をデプロイする

AWS AmplifyにmonorepoのNext.js(App Router)をデプロイする

monorepo管理しているNext.jsをAmplifyにデプロイしようとした際にいくつか躓く内容があったのでまとめておきます。

リモートワーク・オンライン会議でも、スムーズに制作を進めるために大切なこと[資料編]

リモートワーク・オンライン会議でも、スムーズに制作を進めるために大切なこと[資料編]

コロナ禍の影響により、リモートワークの導入をおこなっている制作会社も多く、実際に弊社でも導入しています。

売れるECサイトデザインを作るために。参考にしたいおしゃれな事例の探し方。

売れるECサイトデザインを作るために。参考にしたいおしゃれな事例の探し方。

売れるECサイトのデザインは、「この形式」という決まりはありません。ECサイトで売り上げを上げるなら、しっかりとしたコンセプトと、コンセプトを決定するまでのリサーチが必要です。

制作会社の考える、業務効率化ツールのおすすめ。個人でも使いやすいサービスなど。

制作会社の考える、業務効率化ツールのおすすめ。個人でも使いやすいサービスなど。

新型コロナウイルス感染拡大の影響で、リモートワークが主流になり、弊社でも週のほとんどは各自宅で作業をしています。

Figmaでデザインのコミット履歴を残せるプラグイン【Thought Recorder】をリリースしました

Figmaでデザインのコミット履歴を残せるプラグイン【Thought Recorder】をリリースしました

Figmaを利用するWebデザイナーの助けになれると嬉しいです。使い方は本記事をご覧ください。

ECの構築方法、おすすめのECサービス。

ECの構築方法、おすすめのECサービス。

ファッションや家電、スーパーの買い物でさえもECサイトを利用することが当たり前になりました。加えて新型コロナウイルスの影響もあり、弊社にも「どんなプラットフォームを利用したら良いか」「どれくらいコストがかかるのか」などECに関するさまざまなご相談を頂きます。

FastAPIのスキーマクラスをOpenAPIから生成する方法

FastAPIのスキーマクラスをOpenAPIから生成する方法

PythonでAPIを構築する要件があり、フレームワークに比較的モダンなFastAPIを採用しました。FastAPIはバックエンドの開発を行えば自動でOepnApi定義を生成する機能が備わっていますが、今回はこれを使わず、事前に用意したOepnApi定義からFastAPIで利用するスキーマクラスを生成する方法を紹介します。

Laravel 日本一解りやすい全文検索のマイグレーション記載方法解説

Laravel 日本一解りやすい全文検索のマイグレーション記載方法解説

Laravel + MySQLで全文検索を実装する

GiFT1号目新卒デザイナーの2021年振り返り

GiFT1号目新卒デザイナーの2021年振り返り

いつの間に、年末ですね。入社してもう、9ヶ月も立っていたようです。2021年の振り返りを記事にしました。

TimesclaeDBのデータ圧縮に関して

TimesclaeDBのデータ圧縮に関して

TimescaleDBはデータベース内の一部のテーブルを時系列データとして扱えるPostgreSQLの拡張です。PostgreSQLの機能拡張なので非常に手軽に導入できます。今回はこのTimesaceDBの圧縮について調べたので備忘録として書き綴りました。

すべての記事

お問い合わせ