こんにちは。CData Software Japan リードエンジニアの杉本です。
今回はCData Shopify Driver のチップスとして、メタフィールドに設定された値を取得する方法を紹介したいと思います。
メタフィールドとは?
Shopify は通常標準機能で定義されている項目を使用してデータを管理しますが、自社のユースケースによっては独自の管理項目を設けたいというシチュエーションがあるかと思います。
例えば「Products」に社内独自の型番や原材料の情報などを入力する項目、「Customers」に会員ポイントを設けたいといったことがあるでしょう。そういったShopify 標準機能で提供されていない項目をメタフィールドという機能で追加することができます。
https://help.shopify.com/ja/manual/metafields
例えばCustomers の画面にPoints という項目を設けてみた例です。
「Products」にも以下のように設けることができます。
メタフィールドのカスタマイズは設定画面から「Products」「Variants」「Collections」「Customers」「Orders」「Pages」「Blogs」「Blog posts」に対してそれぞれ変更することができるようになっています。
CData Driver でメタフィールドのデータを取得する方法
それではここからCData Driver でメタフィールドの値を取得する方法を紹介していきます。
メタフィールドの値の取得方法は2種類存在します。それぞれメリット・デメリットがあるので、ユースケースに応じて使い分けると良いでしょう。
対象のスキーマ・API はREST になります。
なお、今回はCData JDBC Driver for Shopify を利用しましたが、CData Sync やODBC、ADO.NETでも同様に利用できます。
https://www.cdata.com/jp/drivers/shopify/jdbc/
IncludeCustomFields プロパティを使った方法
一つは接続プロパティで「IncludeCustomFields」を利用する方法です。
https://cdn.cdata.com/help/FOH/jp/jdbc/RSBShopify_p_IncludeCustomFields.htm
この接続プロパティをTrue することにより「Products」「ProductVariants 」に自動的にメタフィールドの項目が追加されてデータが取得できるようになります。
あとは通常通り「SELECT * FROM Products」というクエリを発行することで、メタフィールドの値も一緒にデータとして取得することができます。
注意点としては、現在対応しているテーブルが「Products」「ProductVariants」のみであること。
また、「Products」「ProductVariants」テーブルのデータの取得時間が長くなることが挙げられます。これは1レコード毎にメタフィールドの値をチェックしてしまうためです。
Metafields テーブルを利用する方法
もう一つは「Metafields」という専用のテーブルを使ってデータを取得する方法です。
https://cdn.cdata.com/help/FOH/jp/jdbc/pg_RESTtable-metafields.htm
Metafields は「OwnerId」というProducts やCustomers など各データの一意の値を示すIdと「OwnerResource 」というデータの種類を示す値を条件として指定することで取得できるようになっています。
例えば、Products にある以下のレコードのメタフィールドを取得したい場合は
以下のようなSQL で取得することができます。
SELECT * FROM Metafields WHERE OwnerId = 64146833431 and OwnerResource = 'product';
なお、OwnerId はIN句を利用することで複数指定することができます。例えばCustomers データのメタフィールドを横断的に取得したい場合は、以下のようにサブクエリで指定することも可能です。
SELECT * FROM Metafields WHERE OwnerResource = 'customer' and OwnerId in (SELECT Id from Customers);
ただ、対象となるOwnerIdのレコード分APIリクエストが行われるので、レコード量に応じた取得時間がかかるので注意しましょう。
ちなみに、OwnerResourceに使える値は「blog」「customer」「draft_order」「variants」「collection」「article」「page」「product_image」「product」「order」となっています。
https://shopify.dev/api/admin-rest/2022-10/resources/metafield#get-metafields?metafield[owner-id]=382285388&metafield[owner-resource]=blog
アドホックにメタフィールドの値を取得したい場合や、「Products」「ProductVariants」以外のメタフィールドの値を取得したい場合は、こちらの「Metafields」テーブルを利用すると良いでしょう。
ただ、データが縦持ちになるのと、元のデータと別テーブルで存在することになるので、実利用の際には別途結果をJOINするなどの工夫が必要です。
おわりに
CData Shopify Driver ではこのようにメタフィールドの値を取得できるようになっています。
上記でも記載しているとおり、APIの仕様上横断的にデータを取得する場合は、それなりに時間を要するので注意しましょう。
もしデータ分析ニーズなどで利用する場合は、CData Syncを用いて、定期的にRDBやDWHにレプリケーションしてしまうことがおすすめです。
https://www.cdata.com/jp/sync/
その他ご不明な点、気になった点などあれば、お気軽にテクニカルサポートまでお問い合わせください。
https://www.cdata.com/jp/support/submit.aspx
ちなみに、この記事は「CData Software Advent Calendar 2022」の1日目でした!
https://qiita.com/advent-calendar/2022/cdatasoftware
関連コンテンツ