
Snowflakeで特定のデータベースやスキーマのテーブルのDDLや情報をまとめて取得する
データ事業本部の鈴木です。
Snowflakeで特定のデータベースやスキーマのテーブルのDDLや情報をまとめて取得したいことがあったのですが、意外とパッとやり方が分からなかったため、調べた内容をまとめます。
どんなDDLでテーブルを作成したか調べる際に役立つほか、最近だとデータベース内のデータを分析するためにLLMのプロンプトに使ったりもします。
1. GET_DDLでDDLをまとめて取得する方法
以下で紹介されているように、GET_DDLでobject_type
としてDATABASE
やSCHEMA
を指定すると取得できました。
以下のようにテーブル個別に取得しようとした場合、object_name
は直接テーブル名の文字列を指定する必要があるため上手く動きませんでした。
with tmp as (
SELECT
*
FROM
データベース名.INFORMATION_SCHEMA.TABLES
)
select get_ddl('TABLE', table_name)
from tmp;
Invalid value [TMP.TABLE_NAME] for function '2', parameter EXPORT_DDL: constant arguments expected
そのため、GET_DDL
だとできないのかな?と思っていたのですが、DATABASE
やSCHEMA
の上の階層で指定すれば取得できました。
WITH source_data AS (
select get_ddl('SCHEMA', 'データベース名.スキーマ名') as ddl
)
SELECT
REGEXP_REPLACE(value, '\n|\t', '') AS parsed_value
FROM source_data,
LATERAL FLATTEN(input => SPLIT(ddl, ';\n')) f;
なお、上記例ではget_ddlから取得したDDLが一つの文字列になっているため、改行などで分割・クレンジングしています。
LATERALについては以下のブログが分かりやすいです。
2. COLUMNSビューからメタデータを取得する方法
DDLそのものではありませんが、COLUMNSビューからカラム単位のメタデータを取得することもできました。
SELECT
COLUMN_NAME, DATA_TYPE, COMMENT
FROM
SAMPLE_DB.INFORMATION_SCHEMA.COLUMNS
WHERE
TABLE_NAME = 'テーブル名'
ORDER BY
table_schema, table_name, ordinal_position;
テーブルに対するコメントも取得したい場合は、TABLESビューのメタデータも取得してテーブル名で結合するとよさそうです。
終わりに
Snowflakeで特定のデータベースやスキーマのテーブルのDDLや情報をまとめて取得する際の方法をご紹介しました。
ほかの方法もあるかもしれませんが、上記2つが使えればだいたいのケースには対応できるのではと思います。
参考になりましたら幸いです。