BigQuery를 사용하여 테이블의 DDL(CreateTable 문)을 INFORMATION -SCHEMA의 강박(?)창설

14202 단어 BigQuery
대충 조사해 봤는데 BQ의 제목처럼 임의의 책상에서Create Table 문장을 얻는 간단한 방법(show create table 등)을 찾지 못해 INFOR MATION을 찾지 못했다SCHEMA로 해봤어요.(스트로크 느낌...
※ 열 수가 수백 열에 달하면 편리할 수 있습니다.
더 스마트한 획득 방법이 있다면 알려주세요.

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

사용법

  • 자신의 환경에 따라 다음과 같은 세 가지 키워드를 수정한다.
  • my-project
  • my-dataset(※ 기타 부분은 수정만 가능하니 여러 곳에서 수정 데이터 set이 필요함)
  • my-table
  • 주의점

  • 아래 정보만 얻었기 때문에 좀 더 편집해야 합니다.(예: 파티션 정보 제외 등)
  • 표명 물리
  • 열명칭물리
  • 표 DESCRIPTION
  • 열 DESCRIPTION
  • 결과 소개


    대상 테이블

    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 텍스트를 가져오려면

  • "SAVE RESULTS"에서 "Google Sheets"를 선택한 결과
  • 스프레드시트에 작성된 A열 복사
  • 왜 특별히 "Google Sheets"를 선택하셨습니까?

  • 'Copy to Clipboard'또는'CSV'의 경우 조회 중인 투피스나 쉼표 등의 영향으로 도피용 투피스가 추가됨에 따라 도피 처리 제거
  • JSON의 경우에도 검색에 직접 사용하기 위해 문자열 처리

  • 끝.

    좋은 웹페이지 즐겨찾기