BigQuery를 사용하여 테이블의 DDL(CreateTable 문)을 INFORMATION -SCHEMA의 강박(?)창설
14202 단어 BigQuery
※ 열 수가 수백 열에 달하면 편리할 수 있습니다.
더 스마트한 획득 방법이 있다면 알려주세요.
CREATE TABLE 문에 대한 질의 생성(SQL SQL 생성)
다음은 DDL(CREATE TABLE 문서)을 생성하는 질의이며, DDL 형식은 "CREATE TABLE XXXXAS SELECT"입니다.
앞부분의 크레이트를 원하거나 반대로 SELECT만 원하는 경우 with 블록의'ddl'을 적당히 편집하면 편리한 형식으로 편집할 수 있다.
with
target as (
select
-- 利用対象のテーブル名になるようここを編集してください
'my-project' as project,
'my-dataset' as dataset, -- データセットだけは下記クエリの方にも複数箇所埋め込まれていることに注意(全部置換必要)
'my-table' as table
),
table_info as (
SELECT
tables.table_catalog,
tables.table_schema,
tables.table_name,
option.option_value,
FROM
my-dataset.INFORMATION_SCHEMA.TABLES tables
cross join target
left join my-dataset.INFORMATION_SCHEMA.TABLE_OPTIONS option
on tables.table_catalog = option.table_catalog
and tables.table_schema = option.table_schema
and tables.table_name = option.table_name
and option_name = 'description'
where
tables.table_catalog = target.project
and tables.table_schema = target.dataset
and tables.table_name = target.table
),
column_info as (
SELECT
column.ordinal_position,
column.column_name,
column.data_type,
path.description,
FROM
my-dataset.INFORMATION_SCHEMA.COLUMNS column
cross join target
left join my-dataset.INFORMATION_SCHEMA.COLUMN_FIELD_PATHS path
on column.table_name = path.table_name
and column.column_name = path.column_name
WHERE
column.table_catalog = target.project
and column.table_schema = target.dataset
and column.table_name = target.table
),
ddl as (
-- はじめの「create table xxx (」までを作る部分
select
0 as ordinal_position,
'create table ' || table_info.table_catalog || '.' || table_info.table_schema || '.' || table_info.table_name || ' (' as text,
from
table_info
union all
-- 「カラム名 データ型 カラム説明」のリストを作る部分
SELECT
column_info.ordinal_position,
' ' || column_info.column_name || ' ' || column_info.data_type || ' options(description="' || ifnull(column_info.description, '') || '"),' as text,
FROM
column_info
union all
-- CREATE TABLE文の最後、テーブルの説明などのオプションを指定する部分(パーティションテーブルも対応したいなどはこの辺をいじればOK)
select
1000000 as ordinal_position,
') options(description = "' || ifnull(trim(table_info.option_value, '"'), '') || '") as select' as text,
from
table_info
union all
-- SELECTのカラムリスト
SELECT
1000000 + column_info.ordinal_position as ordinal_position,
' ' || column_info.column_name || ',' as text,
FROM
column_info
union all
-- SELECTのFrom部
select
10000000 as ordinal_position,
'from ' || table_info.table_catalog || '.' || table_info.table_schema || '.' || table_info.table_name as text,
from
table_info
)
select ddl.text from ddl order by ordinal_position
사용법
주의점
결과 소개
대상 테이블
create table my-dataset.test_table_01 (
col1 NUMERIC options(description="カラム1つ目"),
col2 STRING options(description="カラム2つ目"),
col3 DATETIME options(description="カラム3つ目"),
) options(description = "テストのテーブル")
SQL 실행 결과(SQL에 대한 질의 실행 결과 생성)
프로젝트 ID를 숨깁니다.데이터 세트는 테스트입니다.terui_01.
DDL 활용 방법
BQ의 WEB 콘솔에서 출력되는 것을 여러 줄의 DDL 형태로 만들기 위해서는 조금 번거로운 가공이 필요하다.
→ 파이토존 같은 방법으로 간단한 도구를 만들고 싶었지만 귀찮아서 많이 만들지 못했다.
DDL의 SQL 텍스트를 가져오려면
create table my-dataset.test_table_01 (
col1 NUMERIC options(description="カラム1つ目"),
col2 STRING options(description="カラム2つ目"),
col3 DATETIME options(description="カラム3つ目"),
) options(description = "テストのテーブル")
왜 특별히 "Google Sheets"를 선택하셨습니까?
끝.
Reference
이 문제에 관하여(BigQuery를 사용하여 테이블의 DDL(CreateTable 문)을 INFORMATION -SCHEMA의 강박(?)창설), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/yterui/items/dcb0d8475ef34e46dcb2텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)