์ž์Šต์„œ 1: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค, ์Šคํ‚ค๋งˆ, ํ…Œ์ด๋ธ”, ์›จ์–ดํ•˜์šฐ์Šค ๋งŒ๋“ค๊ธฐยถ

์†Œ๊ฐœยถ

์ด ์ž์Šต์„œ์—์„œ๋Š” Snowflake Python APIs ์„ ์‚ฌ์šฉํ•˜์—ฌ Snowflake ๋ฆฌ์†Œ์Šค ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๊ธฐ๋ณธ ์‚ฌํ•ญ์— ๋Œ€ํ•ด ์•Œ์•„๋ด…๋‹ˆ๋‹ค. API๋ฅผ ์‹œ์ž‘ํ•˜๋ ค๋ฉด Snowflake ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค, ์Šคํ‚ค๋งˆ, ํ…Œ์ด๋ธ” ๋ฐ ๊ฐ€์ƒ ์›จ์–ดํ•˜์šฐ์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

์ „์ œ ์กฐ๊ฑดยถ

์ฐธ๊ณ 

Snowflake Python APIs ์ž์Šต์„œ์˜ ์ผ๋ฐ˜ ์„ค์ • ์˜ ๋‹จ๊ณ„๋ฅผ ์ด๋ฏธ ์™„๋ฃŒํ–ˆ๋‹ค๋ฉด ์ด๋Ÿฌํ•œ ์‚ฌ์ „ ์š”๊ตฌ ์‚ฌํ•ญ์„ ๊ฑด๋„ˆ๋›ฐ๊ณ  ์ด ์ž์Šต์„œ์˜ ์ฒซ ๋ฒˆ์งธ ๋‹จ๊ณ„๋กœ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ์ž์Šต์„œ๋ฅผ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ๋‹ค์Œ ๋‹จ๊ณ„๊ฐ€ ํฌํ•จ๋œ ๊ณตํ†ต ์„ค์ • ์ง€์นจ์„ ์™„๋ฃŒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  • Snowflake Python APIs ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

  • Snowflake ์—ฐ๊ฒฐ์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

  • Python API ์ž์Šต์„œ์— ํ•„์š”ํ•œ ๋ชจ๋“  ๋ชจ๋“ˆ์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

  • API Root ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ํ•„์ˆ˜ ์š”๊ฑด์„ ์™„๋ฃŒํ•˜๋ฉด API๋ฅผ ์‚ฌ์šฉํ•  ์ค€๋น„๊ฐ€ ๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค, ์Šคํ‚ค๋งˆ, ํ…Œ์ด๋ธ” ๋งŒ๋“ค๊ธฐยถ

root ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Snowflake ๊ณ„์ •์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค, ์Šคํ‚ค๋งˆ ๋ฐ ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋ ค๋ฉด ๋…ธํŠธ๋ถ์˜ ๋‹ค์Œ ์…€์—์„œ ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    database = root.databases.create(
      Database(
        name="PYTHON_API_DB"),
        mode=CreateMode.or_replace
      )
    
    Copy

    ์ด ์ฝ”๋“œ๋Š” ๊ธฐ๋Šฅ์ ์œผ๋กœ SQL ๋ช…๋ น CREATE OR REPLACE DATABASE PYTHON_API_DB ์™€ ๋™์ผํ•˜๋ฉฐ, ๊ณ„์ •์— ์ด๋ฆ„์ด PYTHON_API_DB ์ธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด ์ฝ”๋“œ๋Š” Snowflake์—์„œ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ์ผ๋ฐ˜์ ์ธ ํŒจํ„ด์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.

    • root.databases.create() ๋Š” Snowflake์— ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด ํ•จ์ˆ˜๋Š” Database ์˜ค๋ธŒ์ ํŠธ์™€ ๋ชจ๋“œ์˜ ๋‘ ๊ฐ€์ง€ ์ธ์ž๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค.

    • Database(name="PYTHON_API_DB") ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Database ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ „๋‹ฌํ•˜๊ณ  name ์ธ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์ด๋ฆ„์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๋…ธํŠธ๋ถ์˜ 3๋ฒˆ์งธ ์ค„์—์„œ Database ๋ฅผ ๊ฐ€์ ธ์™”๋‹ค๋Š” ์ ์„ ๊ธฐ์–ตํ•˜์‹ญ์‹œ์˜ค.

    • ์ƒ์„ฑ ๋ชจ๋“œ๋Š” mode ์ธ์ž๋ฅผ ์ „๋‹ฌํ•˜์—ฌ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ CreateMode.or_replace ๋กœ ์„ค์ •ํ–ˆ์ง€๋งŒ ๋‹ค์Œ ๊ฐ’๋„ ์œ ํšจํ•ฉ๋‹ˆ๋‹ค.

      • CreateMode.if_not_exists: ๊ธฐ๋Šฅ์€ SQL์˜ CREATE IF NOT EXISTS ์™€ ๋™๋“ฑํ•ฉ๋‹ˆ๋‹ค.

      • CreateMode.error_if_exists: ํ•ด๋‹น ์˜ค๋ธŒ์ ํŠธ๊ฐ€ Snowflake์— ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. ๋ชจ๋“œ๊ฐ€ ์ง€์ •๋˜์ง€ ์•Š์œผ๋ฉด ์ด ๊ฐ’์ด ๊ธฐ๋ณธ๊ฐ’์ž…๋‹ˆ๋‹ค.

    • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ์ด๋ฆ„์ด database ์ธ ์ƒ์„ฑํ•œ ์˜ค๋ธŒ์ ํŠธ์— ์ €์žฅํ•˜์—ฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

    ์ž์„ธํ•œ ๋‚ด์šฉ์€ Python์„ ์‚ฌ์šฉํ•˜์—ฌ Snowflake ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค, ์Šคํ‚ค๋งˆ, ํ…Œ์ด๋ธ” ๋ฐ ๋ทฐ ๊ด€๋ฆฌํ•˜๊ธฐ ์„น์…˜์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

  2. Snowsight ์—์„œ Snowflake ๊ณ„์ •์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„น์…˜์œผ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. ์ฝ”๋“œ๊ฐ€ ์„ฑ๊ณตํ•˜๋ฉด PYTHON_API_DB ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ๋ชฉ๋ก์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

    ํŒ

    VS Code๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ, Snowflake ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ ์„ ์„ค์น˜ํ•˜์—ฌ ํŽธ์ง‘๊ธฐ ๋‚ด์—์„œ ๋ชจ๋“  Snowflake ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์‚ดํŽด๋ด…๋‹ˆ๋‹ค.

  3. PYTHON_API_DB ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์Šคํ‚ค๋งˆ๋ฅผ ์ƒ์„ฑํ•˜๋ ค๋ฉด ๋‹ค์Œ ์…€์—์„œ ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    schema = database.schemas.create(
      Schema(
        name="PYTHON_API_SCHEMA"),
        mode=CreateMode.or_replace,
      )
    
    Copy

    ์ด์ „์— ์ƒ์„ฑํ•œ database ์˜ค๋ธŒ์ ํŠธ์—์„œ .schemas.create() ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค๋Š” ์ ์— ์œ ์˜ํ•˜์‹ญ์‹œ์˜ค.

  4. ๋ฐฉ๊ธˆ ์ƒ์„ฑํ•œ ์Šคํ‚ค๋งˆ์—์„œ ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•˜๋ ค๋ฉด ๋‹ค์Œ ์…€์—์„œ ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    table = schema.tables.create(
      Table(
        name="PYTHON_API_TABLE",
        columns=[
          TableColumn(
            name="TEMPERATURE",
            datatype="int",
            nullable=False,
          ),
          TableColumn(
            name="LOCATION",
            datatype="string",
          ),
        ],
      ),
    mode=CreateMode.or_replace
    )
    
    Copy

    ์ด ์ฝ”๋“œ๋Š” PYTHON_API_SCHEMA ์Šคํ‚ค๋งˆ์— ๋‘ ๊ฐœ์˜ ์—ด๊ณผ ํ•ด๋‹น ๋ฐ์ดํ„ฐ ํƒ€์ž…์ด ์ง€์ •๋œ ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•˜๋ฉฐ, TEMPERATURE ๋ฅผ int ๋กœ, LOCATION ์„ string ์œผ๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

    ์ด ๋งˆ์ง€๋ง‰ ๋‘ ์ฝ”๋“œ ์˜ˆ์ œ๋Š” PYTHON_API_DB ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ƒ์„ฑํ•œ ์ฒซ ๋ฒˆ์งธ ๋‹จ๊ณ„์˜ ํŒจํ„ด์„ ๋”ฐ๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ์ต์ˆ™ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  5. ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ์ƒ์„ฑ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๋ ค๋ฉด Snowsight ์—์„œ Snowflake ๊ณ„์ •์œผ๋กœ ๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค.

์˜ค๋ธŒ์ ํŠธ ๋ฐ์ดํ„ฐ ๊ฒ€์ƒ‰ํ•˜๊ธฐยถ

Snowflake์—์„œ ์˜ค๋ธŒ์ ํŠธ์— ๋Œ€ํ•œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ์ด์ „์— ์ƒ์„ฑํ•œ PYTHON_API_TABLE ํ…Œ์ด๋ธ”์— ๋Œ€ํ•œ ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋…ธํŠธ๋ถ ์…€์—์„œ ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    table_details = table.fetch()
    
    Copy

    fetch() ๋Š” TableModel ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  2. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๊ฒฐ๊ณผ ์˜ค๋ธŒ์ ํŠธ์—์„œ .to_dict() ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ž์„ธํ•œ ์ •๋ณด๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    ํ…Œ์ด๋ธ” ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ์ถœ๋ ฅํ•˜๋ ค๋ฉด ๋‹ค์Œ ์…€์—์„œ ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    table_details.to_dict()
    
    Copy

    ๋…ธํŠธ๋ถ์—๋Š” ๋‹ค์Œ๊ณผ ์œ ์‚ฌํ•œ PYTHON_API_TABLE ํ…Œ์ด๋ธ”์— ๋Œ€ํ•œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๊ฐ€ ํฌํ•จ๋œ ์‚ฌ์ „์ด ํ‘œ์‹œ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    {
        "name": "PYTHON_API_TABLE",
        "kind": "TABLE",
        "enable_schema_evolution": False,
        "change_tracking": False,
        "data_retention_time_in_days": 1,
        "max_data_extension_time_in_days": 14,
        "default_ddl_collation": "",
        "columns": [
            {"name": "TEMPERATURE", "datatype": "NUMBER(38,0)", "nullable": False},
            {"name": "LOCATION", "datatype": "VARCHAR(16777216)", "nullable": True},
        ],
        "created_on": datetime.datetime(
            2024, 5, 9, 8, 59, 15, 832000, tzinfo=datetime.timezone.utc
        ),
        "database_name": "PYTHON_API_DB",
        "schema_name": "PYTHON_API_SCHEMA",
        "rows": 0,
        "bytes": 0,
        "owner": "ACCOUNTADMIN",
        "automatic_clustering": False,
        "search_optimization": False,
        "owner_role_type": "ROLE",
    }
    
    Copy

    ํ‘œ์‹œ๋œ ๊ฒƒ์ฒ˜๋Ÿผ ์ด ์‚ฌ์ „์—๋Š” ์ด์ „์— ์ƒ์„ฑํ•œ PYTHON_API_TABLE ํ…Œ์ด๋ธ”์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ columns, owner, database, schema ๋“ฑ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์ •๋ณด์™€ ํ•จ๊ป˜ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ค๋ธŒ์ ํŠธ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋น„์ฆˆ๋‹ˆ์Šค ๋…ผ๋ฆฌ๋ฅผ ๊ตฌ์ถ•ํ•  ๋•Œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์˜ค๋ธŒ์ ํŠธ์— ๋Œ€ํ•œ ํŠน์ • ์ •๋ณด์— ๋”ฐ๋ผ ์‹คํ–‰๋˜๋Š” ๋…ผ๋ฆฌ๋ฅผ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ๋Š” fetch() ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์˜ค๋ธŒ์ ํŠธ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์œผ๋กœ ํ…Œ์ด๋ธ” ๋ณ€๊ฒฝยถ

ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์œผ๋กœ ํ…Œ์ด๋ธ”์— ์—ด์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ PYTHON_API_TABLE ํ…Œ์ด๋ธ”์—๋Š” ๋‘ ๊ฐœ์˜ ์—ด TEMPERATURE ๋ฐ LOCATION ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ๋Š” int ์œ ํ˜•์˜ ELEVATION ๋ผ๋Š” ์ƒˆ ์—ด์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์ด๋ฅผ ํ…Œ์ด๋ธ”์˜ ๊ธฐ๋ณธ ํ‚ค๋กœ ์„ค์ •ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

  1. ๋‹ค์Œ ์…€์—์„œ ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    table_details.columns.append(
        TableColumn(
          name="elevation",
          datatype="int",
          nullable=False,
          constraints=[PrimaryKey()],
        )
    )
    
    Copy

    ์ฐธ๊ณ 

    ์ด ์ฝ”๋“œ๋Š” ์—ด์„ ์ƒ์„ฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  ์ด ์—ด ์ •์˜๋Š” TableModel ์—์„œ ํ…Œ์ด๋ธ”์˜ ์—ด์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฐฐ์—ด์— ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค. ์ด ๋ฐฐ์—ด์„ ๋ณด๋ ค๋ฉด ํ…Œ์ด๋ธ” ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๋ณด๊ธฐ ์ง€์นจ์— ์„ค๋ช…๋œ ๋Œ€๋กœ columns ์˜ ๊ฐ’์„ ๊ฒ€ํ† ํ•ฉ๋‹ˆ๋‹ค.

  2. ํ…Œ์ด๋ธ”์„ ์ˆ˜์ •ํ•˜๊ณ  ์—ด์„ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด ๋‹ค์Œ ์…€์—์„œ ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    table.create_or_alter(table_details)
    
    Copy

    ์ด ์ค„์—์„œ๋Š” PYTHON_API_TABLE ์„ ๋‚˜ํƒ€๋‚ด๋Š” ์˜ค๋ธŒ์ ํŠธ์—์„œ create_or_alter() ๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  table_details ์˜ ์—…๋ฐ์ดํŠธ๋œ ๊ฐ’์„ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ์ด ์ค„์€ PYTHON_API_TABLE ์— ELEVATION ์—ด์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

  3. ์—ด์ด ์ถ”๊ฐ€๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๋ ค๋ฉด ๋‹ค์Œ ์…€์—์„œ ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    table.fetch().to_dict()
    
    Copy

    ์ถœ๋ ฅ์€ ๋‹ค์Œ๊ณผ ์œ ์‚ฌํ•œ ํ˜•ํƒœ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    {
        "name": "PYTHON_API_TABLE",
        "kind": "TABLE",
        "enable_schema_evolution": False,
        "change_tracking": False,
        "data_retention_time_in_days": 1,
        "max_data_extension_time_in_days": 14,
        "default_ddl_collation": "",
        "columns": [
            {"name": "TEMPERATURE", "datatype": "NUMBER(38,0)", "nullable": False},
            {"name": "LOCATION", "datatype": "VARCHAR(16777216)", "nullable": True},
            {"name": "ELEVATION", "datatype": "NUMBER(38,0)", "nullable": False},
        ],
        "created_on": datetime.datetime(
            2024, 5, 9, 8, 59, 15, 832000, tzinfo=datetime.timezone.utc
        ),
        "database_name": "PYTHON_API_DB",
        "schema_name": "PYTHON_API_SCHEMA",
        "rows": 0,
        "bytes": 0,
        "owner": "ACCOUNTADMIN",
        "automatic_clustering": False,
        "search_optimization": False,
        "owner_role_type": "ROLE",
        "constraints": [
            {"name": "ELEVATION", "column_names": ["ELEVATION"], "constraint_type": "PRIMARY KEY"}
        ]
    }
    
    Copy

    ์ด์ œ ELEVATION ์—ด์„ ํฌํ•จํ•˜๋Š” columns ์˜ ๊ฐ’๊ณผ constraints ์˜ ๊ฐ’์„ ๊ฒ€ํ† ํ•ฉ๋‹ˆ๋‹ค.

  4. ์ƒˆ ์—ด์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋ ค๋ฉด Snowsight ์—์„œ Snowflake ๊ณ„์ •์œผ๋กœ ๋Œ์•„๊ฐ€์„œ ํ…Œ์ด๋ธ”์„ ์‚ดํŽด๋ด…๋‹ˆ๋‹ค.

์›จ์–ดํ•˜์šฐ์Šค ์ƒ์„ฑ ๋ฐ ๊ด€๋ฆฌยถ

Snowflake Python APIs ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ€์ƒ ์›จ์–ดํ•˜์šฐ์Šค๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ํŠน์ • ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์ผ์‹œ์ ์œผ๋กœ ๋‹ค๋ฅธ ์›จ์–ดํ•˜์šฐ์Šค๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ๋Š” API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์›จ์–ดํ•˜์šฐ์Šค๋ฅผ ์ƒ์„ฑ, ์ผ์‹œ ์ค‘๋‹จ ๋˜๋Š” ์‚ญ์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ์„ธ์…˜๊ณผ ๊ด€๋ จ๋œ ์›จ์–ดํ•˜์šฐ์Šค ์ปฌ๋ ‰์…˜์„ ๊ฒ€์ƒ‰ํ•˜๋ ค๋ฉด ๋‹ค์Œ ์…€์—์„œ ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    warehouses = root.warehouses
    
    Copy

    ๊ฒฐ๊ณผ warehouses ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„ธ์…˜์—์„œ ์›จ์–ดํ•˜์šฐ์Šค๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

  2. ์ƒˆ ์›จ์–ดํ•˜์šฐ์Šค๋ฅผ ์ •์˜ํ•˜๊ณ  ์ƒ์„ฑํ•˜๋ ค๋ฉด ๋‹ค์Œ ์…€์—์„œ ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    python_api_wh = Warehouse(
        name="PYTHON_API_WH",
        warehouse_size="SMALL",
        auto_suspend=500,
    )
    
    warehouse = warehouses.create(python_api_wh,mode=CreateMode.or_replace)
    
    Copy

    ์ด ์ฝ”๋“œ์—์„œ๋Š” Warehouse ๋ฅผ ์ธ์Šคํ„ด์Šคํ™”ํ•˜๊ณ  ์›จ์–ดํ•˜์šฐ์Šค์˜ ์ด๋ฆ„, ํฌ๊ธฐ, ์ž๋™ ์ผ์‹œ ์ค‘๋‹จ ์ •์ฑ…์„ ์ง€์ •ํ•˜์—ฌ ์ƒˆ ์›จ์–ดํ•˜์šฐ์Šค๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ์ž๋™ ์ผ์‹œ ์ค‘๋‹จ ์‹œ๊ฐ„ ์ œํ•œ๋Š” ์ดˆ ๋‹จ์œ„์ž…๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ, 8.33๋ถ„ ๋™์•ˆ ์•„๋ฌด๋Ÿฐ ํ™œ๋™์ด ์—†์œผ๋ฉด ์›จ์–ดํ•˜์šฐ์Šค๊ฐ€ ์ผ์‹œ ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค.

    ๊ทธ๋Ÿฐ ๋‹ค์Œ ์›จ์–ดํ•˜์šฐ์Šค ์ปฌ๋ ‰์…˜์—์„œ create() ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์›จ์–ดํ•˜์šฐ์Šค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ warehouse ์˜ค๋ธŒ์ ํŠธ์— ์ฐธ์กฐ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

  3. Snowsight ์—์„œ Snowflake ๊ณ„์ •์œผ๋กœ ์ด๋™ํ•˜์—ฌ ์›จ์–ดํ•˜์šฐ์Šค๊ฐ€ ์ƒ์„ฑ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

  4. ์›จ์–ดํ•˜์šฐ์Šค์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋ ค๋ฉด ๋‹ค์Œ ์…€์—์„œ ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    warehouse_details = warehouse.fetch()
    warehouse_details.to_dict()
    
    Copy

    ์ด ์ฝ”๋“œ๋Š” ์ด์ „ ๋‹จ๊ณ„์—์„œ ํ…Œ์ด๋ธ” ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐ ์‚ฌ์šฉํ•œ ๊ฒƒ๊ณผ ๋™์ผํ•œ ํŒจํ„ด์„ ๋”ฐ๋ฅด๋ฏ€๋กœ ์ต์ˆ™ํ•ด ๋ณด์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ถœ๋ ฅ์€ ๋‹ค์Œ๊ณผ ์œ ์‚ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    {
      'name': 'PYTHON_API_WH',
      'auto_suspend': 500,
      'auto_resume': 'true',
      'resource_monitor': 'null',
      'comment': '',
      'max_concurrency_level': 8,
      'statement_queued_timeout_in_seconds': 0,
      'statement_timeout_in_seconds': 172800,
      'tags': {},
      'warehouse_type': 'STANDARD',
      'warehouse_size': 'Small'
    }
    
    Copy
  5. ์„ ํƒ ์‚ฌํ•ญ: ์„ธ์…˜์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์›จ์–ดํ•˜์šฐ์Šค๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ˜๋ณตํ•˜๊ฑฐ๋‚˜ ํŠน์ • ์›จ์–ดํ•˜์šฐ์Šค๋ฅผ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    ๋‹ค์Œ ์…€์—์„œ ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    warehouse_list = warehouses.iter(like="PYTHON_API_WH")
    result = next(warehouse_list)
    result.to_dict()
    
    Copy

    ์ด ์ฝ”๋“œ์—์„œ๋Š” ์›จ์–ดํ•˜์šฐ์Šค ์ปฌ๋ ‰์…˜์—์„œ like ๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  iter() ์ธ์ž๋ฅผ ์ „๋‹ฌํ•˜๋ฉด ์ง€์ •๋œ ๋ฌธ์ž์—ด๊ณผ ์ด๋ฆ„์ด ์ผ์น˜ํ•˜๋Š” ๋ชจ๋“  ์›จ์–ดํ•˜์šฐ์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ์ด์ „์— ์ •์˜ํ•œ ์›จ์–ดํ•˜์šฐ์Šค์˜ ์ด๋ฆ„์„ ์ „๋‹ฌํ•˜์ง€๋งŒ ์ด ์ธ์ž๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š๋Š” ๋ฌธ์ž์—ด๋กœ ํ•„ํ„ฐ ์—ญํ• ์„ ํ•˜๋ฉฐ % ๋ฐ _ ๊ฐ™์€ SQL ์™€์ผ๋“œ์นด๋“œ ๋ฌธ์ž๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

    ์…€์„ ์‹คํ–‰ํ•œ ํ›„ ๋‹ค์Œ ์ฝ”๋“œ์™€ ์œ ์‚ฌํ•œ ์ถœ๋ ฅ์€ ์ผ์น˜ํ•˜๋Š” ์›จ์–ดํ•˜์šฐ์Šค๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ๋ฐ˜ํ™˜๋˜์—ˆ์Œ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

    {
      'name': 'PYTHON_API_WH',
      'auto_suspend': 500,
      'auto_resume': 'true',
      'resource_monitor': 'null',
      'comment': '',
      'max_concurrency_level': 8,
      'statement_queued_timeout_in_seconds': 0,
      'statement_timeout_in_seconds': 172800,
      'tags': {},
      'warehouse_type': 'STANDARD',
      'warehouse_size': 'Small'
    }
    
    Copy
  6. ์›จ์–ดํ•˜์šฐ์Šค์˜ ํฌ๊ธฐ๋ฅผ LARGE ๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์œผ๋กœ ์ˆ˜์ •ํ•˜๋ ค๋ฉด ๋‹ค์Œ ์…€์—์„œ ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    warehouse = root.warehouses.create(Warehouse(
        name="PYTHON_API_WH",
        warehouse_size="LARGE",
        auto_suspend=500,
    ), mode=CreateMode.or_replace)
    
    Copy
  7. ์›จ์–ดํ•˜์šฐ์Šค ํฌ๊ธฐ๊ฐ€ LARGE ๋กœ ์—…๋ฐ์ดํŠธ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๋ ค๋ฉด ๋‹ค์Œ ์ค‘ ํ•˜๋‚˜๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    • ๋‹ค์Œ ์…€์—์„œ ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

      warehouse.fetch().size
      
      Copy
    • Snowsight ์—์„œ Snowflake ๊ณ„์ •์œผ๋กœ ์ด๋™ํ•˜์—ฌ ๋ณ€๊ฒฝ๋œ ์›จ์–ดํ•˜์šฐ์Šค ํฌ๊ธฐ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

  8. ์„ ํƒ ์‚ฌํ•ญ: ์›จ์–ดํ•˜์šฐ์Šค๋ฅผ ๊ณ„์† ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์ง€ ์•Š์œผ๋ฉด ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ์…€์—์„œ ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    warehouse.drop()
    
    Copy
  9. ์›จ์–ดํ•˜์šฐ์Šค ์‚ญ์ œ๋ฅผ ํ™•์ธํ•˜๋ ค๋ฉด Snowsight ์—์„œ Snowflake ๊ณ„์ •์œผ๋กœ ๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค.

๋‹ค์Œ์—๋Š” ๋ฌด์—‡์„ ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?ยถ

์ถ•ํ•˜ํ•ฉ๋‹ˆ๋‹ค! ์ด ์ž์Šต์„œ์—์„œ๋Š” Snowflake Python APIs ์„ ์‚ฌ์šฉํ•˜์—ฌ Snowflake ๋ฆฌ์†Œ์Šค ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๊ธฐ๋ณธ ์‚ฌํ•ญ์— ๋Œ€ํ•ด ์•Œ์•„๋ด…๋‹ˆ๋‹ค.

์š”์•ฝยถ

์ด ๊ณผ์ •์—์„œ ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์™„๋ฃŒํ–ˆ์Šต๋‹ˆ๋‹ค.

  • Snowflake Python APIs ์„ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

  • Snowflake์— ์—ฐ๊ฒฐ์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค, ์Šคํ‚ค๋งˆ, ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

  • ์˜ค๋ธŒ์ ํŠธ ์ •๋ณด๋ฅผ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค.

  • ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ ์œผ๋กœ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

  • ์›จ์–ดํ•˜์šฐ์Šค๋ฅผ ์ƒ์„ฑ, ์ค‘๋‹จ ๋ฐ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ์ž์Šต์„œยถ

์ด์ œ ์ž‘์—… ๋ฐ ์ž‘์—… ๊ทธ๋ž˜ํ”„๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ฃผ๋Š” ์ž์Šต์„œ 2: ์ž‘์—… ๋ฐ ์ž‘์—… ๊ทธ๋ž˜ํ”„(DAG) ๋งŒ๋“ค๊ธฐ ๋ฐ ๊ด€๋ฆฌ ๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ถ”๊ฐ€ ๋ฆฌ์†Œ์Šคยถ

API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Snowflake์—์„œ ๋‹ค๋ฅธ ์œ ํ˜•์˜ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋” ๋งŽ์€ ์˜ˆ์ œ๋Š” ๋‹ค์Œ ๊ฐœ๋ฐœ์ž ๊ฐ€์ด๋“œ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

๊ฐ€์ด๋“œ

์„ค๋ช…

Python์„ ์‚ฌ์šฉํ•˜์—ฌ Snowflake ์‚ฌ์šฉ์ž, ์—ญํ•  ๋ฐ ๊ถŒํ•œ ๊ด€๋ฆฌ

API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž, ์—ญํ•  ๋ฐ ๋ณด์กฐ๊ธˆ์„ ์ƒ์„ฑํ•˜๊ณ  ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

Python์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ ๋กœ๋”ฉ ๋ฐ ์–ธ๋กœ๋”ฉ ๋ฆฌ์†Œ์Šค ๊ด€๋ฆฌ

API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์™ธ๋ถ€ ๋ณผ๋ฅจ, ํŒŒ์ดํ”„, ์Šคํ…Œ์ด์ง€๋ฅผ ํฌํ•จํ•œ ๋ฐ์ดํ„ฐ ๋กœ๋”ฉ ๋ฐ ์–ธ๋กœ๋”ฉ ๋ฆฌ์†Œ์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

Python์„ ์‚ฌ์šฉํ•˜์—ฌ Snowflake ์ž‘์—… ๋ฐ ์ž‘์—… ๊ทธ๋ž˜ํ”„ ๊ด€๋ฆฌํ•˜๊ธฐ

API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘์—…๊ณผ ์ž‘์—… ๊ทธ๋ž˜ํ”„๋ฅผ ์ƒ์„ฑ, ์‹คํ–‰, ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

Python์„ ์‚ฌ์šฉํ•˜์—ฌ Snowpark ์ปจํ…Œ์ด๋„ˆ ์„œ๋น„์Šค(์„œ๋น„์Šค ํ•จ์ˆ˜ ํฌํ•จ) ๊ด€๋ฆฌํ•˜๊ธฐ

API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ปดํ“จํŒ… ํ’€, ์ด๋ฏธ์ง€ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ, ์„œ๋น„์Šค, ์„œ๋น„์Šค ํ•จ์ˆ˜ ๋“ฑ Snowpark Container Services์˜ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.