Python ์ปค๋ฅํฐ APIยถ
Python์ฉ Snowflake Connector๋ Python Database API v2.0 ์ฌ์(PEP-249)์ ๊ตฌํํฉ๋๋ค. ์ด ํญ๋ชฉ์์๋ ํ์ค API์ Snowflake ๊ณ ์ ํ์ฅ์ ๋ํด ๋ค๋ฃน๋๋ค.
์์ธํ ๋ด์ฉ์ PEP-249 ์ค๋ช ์๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
์ด ํญ๋ชฉ์ ๋ด์ฉ:
๋ชจ๋: snowflake.connector
ยถ
๊ธฐ๋ณธ ๋ชจ๋์ snowflake.connector
์ด๋ฉฐ, ์ด ๋ชจ๋์์๋ Connection
์ค๋ธ์ ํธ๋ฅผ ์์ฑํ๊ณ Error
ํด๋์ค๋ฅผ ์ ๊ณตํฉ๋๋ค.
์์ยถ
- apilevelยถ
์ง์๋๋ API ๋ ๋ฒจ์ ๋ํ๋ด๋ ๋ฌธ์์ด ์์์ ๋๋ค. ์ปค๋ฅํฐ๋ API
"2.0"
์ ์ง์ํฉ๋๋ค.
- threadsafetyยถ
์ธํฐํ์ด์ค์์ ์ง์๋๋ ์ค๋ ๋ ์์ ๋ ๋ฒจ์ ๋ํ๋ด๋ ์ ์ ์์์ ๋๋ค. Python์ฉ Snowflake ์ปค๋ฅํฐ๋ ๋ ๋ฒจ
2
๋ฅผ ์ง์ํ๋ฉฐ, ์ด๋ ์ค๋ ๋๊ฐ ๋ชจ๋ ๋ฐ ์ฐ๊ฒฐ์ ๊ณต์ ํจ์ ๋ํ๋ ๋๋ค.
- paramstyleยถ
์ธํฐํ์ด์ค์์ ์๊ตฌ๋๋ ๋งค๊ฐ ๋ณ์ ๋ง์ปค ํ์์ ํ์ ์ ๋ํ๋ด๋ ๋ฌธ์์ด ์์์ ๋๋ค. ์ปค๋ฅํฐ๋ ๊ธฐ๋ณธ์ ์ผ๋ก
"pyformat"
ํ์ ์ ์ง์ ํ๋ฉฐ, ์ด๋ Python ํ์ฅ ํ์ ์ฝ๋(์:...WHERE name=%s
๋๋...WHERE name=%(name)s
)์ ์ ์ฉ๋ฉ๋๋ค.Connection.connect
๋paramstyle
์ ์ฌ์ ์ํ์ฌ ๋ฐ์ธ๋ฉ ๋ณ์ ํ์์"qmark"
๋๋"numeric"
์ผ๋ก ๋ณ๊ฒฝํ๋ฉฐ, ์ฌ๊ธฐ์ ๋ณ์๋ ๊ฐ๊ฐ?
๋๋:N
์ ๋๋ค.์:
format: .execute("... WHERE my_column = %s", (value,)) pyformat: .execute("... WHERE my_column = %(name)s", {"name": value}) qmark: .execute("... WHERE my_column = ?", (value,)) numeric: .execute("... WHERE my_column = :1", (value,))
์ฐธ๊ณ
๋ฐ์ธ๋ฉ ๋ณ์๋
paramstyle
์ด"pyformat"
๋๋"format"
์ธ ๊ฒฝ์ฐ์๋ ํด๋ผ์ด์ธํธ ์ธก์์ ๊ทธ๋ฆฌ๊ณ"qmark"
๋๋"numeric"
์ธ ๊ฒฝ์ฐ์๋ ์๋ฒ ์ธก์์ ๋ฐ์ํฉ๋๋ค. ์ปค๋ฅํฐ๋ SQL ํ ์คํธ๋ฅผ ์ปดํ์ผํ ํ ๋ค์ค ์คํ์ ์ง์ํ์ง ์์ผ๋ฏ๋ก, ํ์ฌ ์ฑ๋ฅ ๋๋ ๊ธฐ๋ฅ์ ์ธก๋ฉด์์ ์ด๋ฌํ ์ต์ ์ฌ์ด์๋ ์ปค๋ค๋ ์ฐจ์ด๊ฐ ์์ต๋๋ค. ๋์ ,"qmark"
๋ฐ"numeric"
์ต์ ์ ๋ค๋ฅธ ๋๋ผ์ด๋ฒ(์ฆ, JDBC, ODBC, Go Snowflake Driver)์ ์ฟผ๋ฆฌ ํ ์คํธ์ ํธํ๋๋ฉฐ, ์ด๋?
๋๋:N
๋ณ์ ํ์์ ์ฌ์ฉํ ์๋ฒ์ธก ๋ฐ์ธ๋ฉ์ ์ง์ํฉ๋๋ค.
ํจ์ยถ
- connect(parameters...)ยถ
- ๋ชฉ์ :
๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก์ ์ฐ๊ฒฐ์ ์์ฑํ๊ธฐ ์ํ ์์ฑ์๋ก,
Connection
์ค๋ธ์ ํธ๋ฅผ ๋ฐํํฉ๋๋ค.์๋ ์ปค๋ฐ ๋ชจ๋๋ ๊ธฐ๋ณธ์ ์ผ๋ก ํ์ฑํ๋ฉ๋๋ค (์ฆ, ์ฐ๊ฒฐ์ด ์ข ๋ฃ๋๋ฉด ๋ชจ๋ ๋ณ๊ฒฝ ์ฌํญ์ด ์ปค๋ฐ๋จ). ํธ๋์ญ์ ์ด ํ์ํ ๊ฒฝ์ฐ, BEGIN ๋ช ๋ น์ ์ฌ์ฉํ์ฌ ํธ๋์ญ์ ์ ์์ํ๊ณ COMMIT ๋๋ ROLLBACK ๋ช ๋ น์ ์ฌ์ฉํ์ฌ ๋ณ๊ฒฝ ์ฌํญ์ ์ปค๋ฐํ๊ฑฐ๋ ๋กค๋ฐฑํฉ๋๋ค.
- ๋งค๊ฐ ๋ณ์:
์ ํจํ ์ ๋ ฅ ๋งค๊ฐ ๋ณ์:
๋งค๊ฐ ๋ณ์
ํ์
์ค๋ช
account
์
์ฌ์ฉ์์ ๊ณ์ ์๋ณ์์ ๋๋ค. ๊ณ์ ์๋ณ์์๋
snowflakecomputing.com
์ ๋ฏธ์ฌ๊ฐ ํฌํจ๋์ง ์์ต๋๋ค. . . ์์ธํ ์ ๋ณด๋ ์๋ ์ด ํญ๋ชฉ์ ์ฌ์ฉ๋ฒ ๋ ธํธ ๋ฅผ ์ฐธ์กฐํ์ญ์์ค.user
์
์ฌ์ฉ์์ ๋ก๊ทธ์ธ ์ด๋ฆ์ ๋๋ค.
password
์
์ฌ์ฉ์์ ๋น๋ฐ๋ฒํธ์ ๋๋ค.
application
์ฐ๊ฒฐ์ ์๋ํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์๋ณํ๋ ์ด๋ฆ์ ๋๋ค.
region
๋ ์ด์ ์ฌ์ฉ๋์ง ์์ ์ด ๋งค๊ฐ ๋ณ์ ์ค๋ช ์ ์ด์ ๋ฒ์ ๊ณผ์ ํธํ์ฑ๋ง์ ์ํด์ ์ ๊ณต๋ฉ๋๋ค.
host
ํธ์คํธ ์ด๋ฆ์ ๋๋ค.
port
ํฌํธ ๋ฒํธ(๊ธฐ๋ณธ๊ฐ์
443
)์ ๋๋ค.database
์ฌ์ฉํ ๊ธฐ๋ณธ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ด๋ฆ์ ๋๋ค. ๋ก๊ทธ์ธํ ํ์๋ USE DATABASE ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
schema
๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ฌ์ฉํ ๊ธฐ๋ณธ ์คํค๋ง์ ์ด๋ฆ์ ๋๋ค. ๋ก๊ทธ์ธํ ํ์๋ USE SCHEMA ๋ฅผ ์ฌ์ฉํ์ฌ ์คํค๋ง๋ฅผ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
role
์ฌ์ฉํ ๊ธฐ๋ณธ ์ญํ ์ ์ด๋ฆ์ ๋๋ค. ๋ก๊ทธ์ธํ ํ์๋ USE ROLE ๋ฅผ ์ฌ์ฉํ์ฌ ์ญํ ์ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
warehouse
์ฌ์ฉํ ๊ธฐ๋ณธ ์จ์ดํ์ฐ์ค์ ์ด๋ฆ์ ๋๋ค. ๋ก๊ทธ์ธํ ํ์๋ USE WAREHOUSE ๋ฅผ ์ฌ์ฉํ์ฌ ์จ์ดํ์ฐ์ค๋ฅผ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
passcode_in_password
๊ธฐ๋ณธ์ ์ผ๋ก
False
์ ๋๋ค. MFA(๋ค๋จ๊ณ ์ธ์ฆ) ์ํธ๊ฐ ๋ก๊ทธ์ธ ์ํธ์ ํฌํจ๋ ๊ฒฝ์ฐ ์ด ๊ฐ์True
๋ก ์ค์ ํฉ๋๋ค.passcode
๋ก๊ทธ์ธ์์ MFA(๋ค๋จ๊ณ ์ธ์ฆ)๋ฅผ ์ฌ์ฉํ ๋ Duo์์ ์ ๊ณต๋๋ ์ํธ์ ๋๋ค.
private_key
์ธ์ฆ์์ ์ฌ์ฉํ ๊ฐ์ธ ํค์ ๋๋ค. ์์ธํ ๋ด์ฉ์ ํค ํ์ด ์ธ์ฆ ๋ฐ ํค ํ์ด ์ํ ์ฌ์ฉํ๊ธฐ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
private_key_file
์ง์ ๋ ์ฌ์ฉ์์ ๋ํ ๊ฐ์ธ ํค ํ์ผ์ ๊ฒฝ๋ก๋ฅผ ์ง์ ํฉ๋๋ค. ํค ํ์ด ์ธ์ฆ ๋ฐ ํค ํ์ด ์ํ ์ฌ์ฉํ๊ธฐ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
private_key_file_pwd
์ง์ ๋ ์ฌ์ฉ์์ ๊ฐ์ธ ํค ํ์ผ์ ํด๋ ํ๊ธฐ ์ํ ์ํธ ๊ตฌ๋ฌธ์ ์ง์ ํฉ๋๋ค. ํค ํ์ด ์ธ์ฆ ๋ฐ ํค ํ์ด ์ํ ์ฌ์ฉํ๊ธฐ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
autocommit
๊ธฐ๋ณธ์ ์ผ๋ก
None
์ด๋ฉฐ, Snowflake ๋งค๊ฐ ๋ณ์ AUTOCOMMIT ์ ๋ฐ๋ฆ ๋๋ค. ์ธ์ ์์ ์๋ ์ปค๋ฐ ๋ชจ๋๋ฅผ ํ์ฑํ ๋๋ ๋นํ์ฑํํ๋ ค๋ฉด ๊ฐ๊ฐTrue
๋๋False
๋ก ์ค์ ํฉ๋๋ค.client_prefetch_threads
๊ฒฐ๊ณผ ์ธํธ๋ฅผ ๋ค์ด๋ก๋ํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ ์ค๋ ๋ ์(๊ธฐ๋ณธ์ ์ผ๋ก
4
)์ ๋๋ค. ๊ฐ์ ๋๋ฆฌ๋ฉด ํ์น ์ฑ๋ฅ์ด ํฅ์๋์ง๋ง ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ ๋ง์ด ํ์ํฉ๋๋ค.client_session_keep_alive
์ธ์ ์ ๋ฌดํ๋๋ก ํ์ฑ์ผ๋ก ์ ์งํ๋ ค๋ฉด(์ฌ์ฉ์์ ํ๋์ด ์๋ ๊ฒฝ์ฐ์๋) ์ด ๊ฐ์
True
๋ก ์ค์ ํฉ๋๋ค. ์ด ๊ฐ์True
๋ก ์ค์ ํ๋ฉดclose
๋ฉ์๋๊ฐ ํธ์ถ๋์ด ์ค๋ ๋๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ข ๋ฃ๋ฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด, ํ๋ก์ธ์ค๊ฐ ์ค๋จ๋ ์ ์์ต๋๋ค. ๊ธฐ๋ณธ๊ฐ์ ์ฌ์ฉ ์ค์ธ ์ปค๋ฅํฐ์ ๋ฒ์ ์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค.๋ฒ์ 2.4.6 ์ด์: ๊ธฐ๋ณธ์ ์ผ๋ก
None
์ ๋๋ค. . ๊ฐ์ดNone
์ธ ๊ฒฝ์ฐ CLIENT_SESSION_KEEP_ALIVE ์ธ์ ๋งค๊ฐ ๋ณ์๊ฐ ์ฐ์ ์์๋ฅผ ๊ฐ์ต๋๋ค. . . ์ธ์ ๋งค๊ฐ ๋ณ์๋ฅผ ์ฌ์ ์ํ๋ ค๋ฉด ์ด ์ธ์์True
๋๋False
๋ฅผ ์ ๋ฌํฉ๋๋ค.๋ฒ์ 2.4.5 ์ด์ : ๊ธฐ๋ณธ์ ์ผ๋ก
False
์ ๋๋ค. . ์ด ๊ฐ์ดFalse
(๊ฐ์ ๋ช ์์ ์ผ๋ก ์ง์ ํ๊ฑฐ๋ ์ธ์๋ฅผ ์๋ตํ์ฌ)์ธ ๊ฒฝ์ฐ CLIENT_SESSION_KEEP_ALIVE ์ธ์ ๋งค๊ฐ ๋ณ์๊ฐ ์ฐ์ ์์๋ฅผ ๊ฐ์ต๋๋ค. . .
connect
๋ฉ์๋์client_session_keep_alive=False
๋ฅผ ์ ๋ฌํด๋CLIENT_SESSION_KEEP_ALIVE
์ธ์ ๋งค๊ฐ ๋ณ์์ ๊ฐTRUE
๋ฅผ ์ฌ์ ์ํ์ง ์์ต๋๋ค.login_timeout
๋ก๊ทธ์ธ์ ์๊ฐ ์ ํ(์ด)์ ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก 60์ด์ ๋๋ค. HTTP ์๋ต์ด โ์ฑ๊ณตโ์ธ ๊ฒฝ์ฐ ์๊ฐ ์ ํ ๊ธธ์ด ์ดํ์๋ ๋ก๊ทธ์ธ ์์ฒญ์ด ์ํ๋์ง ์์ต๋๋ค.
network_timeout
๊ธฐํ ๋ชจ๋ ์์ ์ ์๊ฐ ์ ํ(์ด)์ ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ์์/๋ฌดํ๋์ ๋๋ค. HTTP ์๋ต์ด โ์ฑ๊ณตโ์ด ์๋ ๊ฒฝ์ฐ ์๊ฐ ์ ํ ๊ธธ์ด ์ดํ์๋ ์ผ๋ฐ ์์ฒญ์ด ์ํ๋์ง ์์ต๋๋ค.
ocsp_response_cache_filename
OCSP ์๋ต ์บ์ ํ์ผ์ ๋ํ URI์ ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก OCSP ์๋ต ์บ์ ํ์ผ์ ๋ค์ ์บ์ ๋๋ ํฐ๋ฆฌ์ ์์ฑ๋ฉ๋๋ค.
Linux:
~/.cache/snowflake/ocsp_response_cache
macOS:
~/Library/Caches/Snowflake/ocsp_response_cache
Windows:
%USERPROFILE%AppDataLocalSnowflakeCachesocsp_response_cache
๋ค๋ฅธ ๋๋ ํฐ๋ฆฌ์์ ํ์ผ์ ์ฐพ์ผ๋ ค๋ฉด, URI ์ ๊ฒฝ๋ก์ ํ์ผ ์ด๋ฆ์ ์ง์ ํฉ๋๋ค(์:
file:///tmp/my_ocsp_response_cache.txt
).authenticator
Snowflake์ฉ ์ธ์ฆ์:
๋ด๋ถ Snowflake ์ธ์ฆ์๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด
snowflake
(๊ธฐ๋ณธ๊ฐ).์น ๋ธ๋ผ์ฐ์ ๋ฐ Okta, AD FS ๋๋ ๊ณ์ ์ ์ ์๋ ๊ธฐํ ๋ชจ๋ SAML 2.0 ๊ท๊ฒฉ ID ๊ณต๊ธ์(IdP)๋ฅผ ์ฌ์ฉํ์ฌ ์ธ์ฆํ๋ ค๋ฉด
externalbrowser
.๊ธฐ๋ณธ Okta๋ฅผ ํตํด ์ธ์ฆํ๋ ค๋ฉด
https://<okta_๊ณ์ _์ด๋ฆ>.okta.com
(์ฆ, Okta ๊ณ์ ์ URL ์๋ํฌ์ธํธ).OAuth๋ฅผ ์ฌ์ฉํ์ฌ ์ธ์ฆํ๋ ค๋ฉด
oauth
.token
๋งค๊ฐ ๋ณ์๋ฅผ ์ง์ ํ๊ณ ๊ฐ์ OAuth ์ก์ธ์ค ํ ํฐ์ผ๋ก ์ง์ ํด์ผ ํฉ๋๋ค.MFA ํ ํฐ ์บ์ฑ์ ์ฌ์ฉํ์ฌ ์ธ์ฆํ๋ ค๋ฉด
username_password_mfa
. ์์ธํ ๋ด์ฉ์ MFA ํ ํฐ ์บ์ฑ์ ์ฌ์ฉํ์ฌ ์ธ์ฆ ๋์ค ํ๋กฌํํธ ์ ์ต์ํํ๊ธฐ โ ์ ํ ์ฌํญ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.OAuth 2.0 Authorization Code ํ๋ฆ์ ์ฌ์ฉํ๊ธฐ ์ํ
OAUTH_AUTHORIZATION_CODE
.OAuth 2.0 Client Credentials ํ๋ฆ์ ์ฌ์ฉํ๊ธฐ ์ํ
OAUTH_CLIENT_CREDENTIALS
์ด ๊ฐ์ด
snowflake
๊ฐ ์๋ ๊ฒฝ์ฐ, ์ฌ์ฉ์ ๋ฐ ๋น๋ฐ๋ฒํธ ๋งค๊ฐ ๋ณ์๋ IdP์ ๋ก๊ทธ์ธ ์๊ฒฉ ์ฆ๋ช ์ด์ด์ผ ํฉ๋๋ค.validate_default_parameters
๊ธฐ๋ณธ์ ์ผ๋ก
False
์ ๋๋ค.True
์ธ ๊ฒฝ์ฐ:์ง์ ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค, ์คํค๋ง ๋๋ ์จ์ดํ์ฐ์ค๊ฐ ์์ผ๋ฉด ์์ธ๊ฐ ๋ฐ์ํฉ๋๋ค.
์ ํจํ์ง ์์ ์ธ์ ์ด๋ฆ ๋๋ ์๋ชป๋ ๋ฐ์ดํฐ ํ์ ์ ์ธ์ ๊ฐ์ด ์ ๋ฌ๋๋ฉด stderr์ ๊ฒฝ๊ณ ๊ฐ ํ์๋ฉ๋๋ค.
paramstyle
ํด๋ผ์ด์ธํธ์ธก ๋ฐ์ธ๋ฉ์ ๊ฒฝ์ฐ ๊ธฐ๋ณธ์ ์ผ๋ก
pyformat
์ ๋๋ค.qmark
๋๋numeric
๋ฅผ ์ง์ ํ์ฌ ์๋ฒ์ธก ๋ฐ์ธ๋ฉ์ ๋ฐ์ธ๋ฉ ๋ณ์ ํ์์ ๋ณ๊ฒฝํฉ๋๋ค.timezone
๊ธฐ๋ณธ์ ์ผ๋ก
None
์ด๋ฉฐ, Snowflake ๋งค๊ฐ ๋ณ์ TIMEZONE ์ ๋ฐ๋ฆ ๋๋ค. ์ ํจํ ํ์์กด(์:America/Los_Angeles
)์ ์ค์ ํ์ฌ ์ธ์ ํ์์กด์ ์ค์ ํฉ๋๋ค.arrow_number_to_decimal
๊ธฐ๋ณธ์ ์ผ๋ก
False
์ด๋ฉฐ, ์ฆ NUMBER ์ด ๊ฐ์ ๋ฐฐ์ ๋ฐ๋ ๋ถ๋ ์์์ ์ซ์(float64
)๋ก ๋ฐํ๋ฉ๋๋ค. . .fetch_pandas_all()
๋ฐfetch_pandas_batches()
๋ฉ์๋๋ฅผ ํธ์ถํ ๋ DECIMAL ์ด ๊ฐ์ 10์ง์(decimal.Decimal
)๋ก ๋ฐํํ๋ ค๋ฉด ์ด ๊ฐ์True
๋ก ์ค์ ํฉ๋๋ค. . . ์ด ๋งค๊ฐ ๋ณ์๋ Python์ฉ Snowflake ์ปค๋ฅํฐ์ 2.4.3 ๋ฒ์ ์์ ๋์ ๋์์ต๋๋ค.socket_timeout
์์ผ ์์ค ์ฝ๊ธฐ ๋ฐ ์ฐ๊ฒฐ ์์ฒญ์ ๋ํ ์๊ฐ ์ ํ(์ด)์ ๋๋ค. ์์ธํ ๋ด์ฉ์ ์ฐ๊ฒฐ ์๊ฐ ์ ํ ๊ด๋ฆฌํ๊ธฐ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
backoff_policy
์ฌ์๋ ๊ฐ ๋๊ธฐ ์๊ฐ์ ์ ์ํ๋ ์์ฑ๊ธฐ ํจ์์ ์ด๋ฆ์ ๋๋ค. ์์ธํ ๋ด์ฉ์ ์ฌ์๋์ ๋ํ ์ฐ๊ฒฐ ๋ฐฑ์คํ ์ ์ฑ ๊ด๋ฆฌํ๊ธฐ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
enable_connection_diag
์ฐ๊ฒฐ ์ง๋จ ๋ณด๊ณ ์๋ฅผ ์์ฑํ์ง ์ฌ๋ถ. ๊ธฐ๋ณธ๊ฐ์
False
์ ๋๋ค.connection_diag_log_path
์ง๋จ ๋ณด๊ณ ์ ์์น์ ๋ํ ์ ๋ ๊ฒฝ๋ก์ ๋๋ค.
enable_connection_diag
๊ฐTrue
์ธ ๊ฒฝ์ฐ์๋ง ์ฌ์ฉ๋ฉ๋๋ค. ๊ธฐ๋ณธ๊ฐ์ ์ด์ ์ฒด์ ์ ๊ธฐ๋ณธ ์์ ๋๋ ํฐ๋ฆฌ(์: Linux ๋๋ Mac์ ๊ฒฝ์ฐ/tmp
)์ ๋๋ค.connection_diag_allowlist_path
SYSTEM$ALLOWLIST()
๋๋SYSTEM$ALLOWLIST_PRIVATELINK()
์ ์ถ๋ ฅ์ด ํฌํจ๋ JSON ํ์ผ์ ์ ๋ ๊ฒฝ๋ก์ ๋๋ค. ์ฐ๊ฒฐ์ ์ ์๋ ์ฌ์ฉ์์๊ฒ ์์คํ ํ์ฉ ๋ชฉ๋ก ํจ์๋ฅผ ์คํํ ๊ถํ์ด ์๊ฑฐ๋ ๊ณ์ URL์ ์ฐ๊ฒฐ์ด ์คํจํ ๊ฒฝ์ฐ์๋ง ํ์ํฉ๋๋ค.iobound_tpe_limit
preprocess_tpe ๋ฐ postprocess TPE(threadpool executor)์ ํฌ๊ธฐ์ ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ๊ฐ์ ํ์ผ ์์ CPU ์ฝ์ด ์ ์ค ์์ ์ชฝ์ผ๋ก ์ค์ ๋ฉ๋๋ค.
unsafe_file_write
GET ๋ช ๋ น์ ์ฌ์ฉํ์ฌ ์คํ ์ด์ง์์ ๋ค์ด๋ก๋ํ ํ์ผ์ ํ ๋นํ ํ์ผ ๊ถํ์ ์ง์ ํฉ๋๋ค.
False
(๊ธฐ๋ณธ๊ฐ)๋ก ์ง์ ํ๋ฉด ํ์ผ ๊ถํ์600
์ผ๋ก ์ค์ ํ์ฌ ์์ ์๋ง ํ์ผ์ ์ก์ธ์คํ ์ ์์ต๋๋ค.True
๋ฅผ ์ง์ ํ๋ฉด ๊ถํ์644
๋ก ์ค์ ํ์ฌ ์์ ์์๊ฒ ์ฝ๊ธฐ ๋ฐ ์ฐ๊ธฐ ๊ถํ์ ๋ถ์ฌํ๊ณ , ๊ทธ ์ธ ๋ชจ๋ ์ฌ์ฉ์์๊ฒ๋ ์ฝ๊ธฐ ์ ์ฉ ๊ถํ์ ๋ถ์ฌํ ์ ์์ต๋๋ค. ์์ธํ ๋ด์ฉ์ ๋ฐ์ดํฐ ๋ค์ด๋ก๋ํ๊ธฐ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.oauth_client_id
client id
์ ๊ฐ์ Snowflake ํตํฉ์ ์ํด ID ๊ณต๊ธ์๊ฐ ์ ๊ณตํ ๊ฒ์ ๋๋ค(Snowflake ๋ณด์ ํตํฉ ๋ฉํ๋ฐ์ดํฐ).oauth_client_secret
client secret
์ ๊ฐ์ Snowflake ํตํฉ์ ์ํด ID ๊ณต๊ธ์๊ฐ ์ ๊ณตํ ๊ฒ์ ๋๋ค(Snowflake ๋ณด์ ํตํฉ ๋ฉํ๋ฐ์ดํฐ).oauth_authorization_url
๋๋ผ์ด๋ฒ์ ์ธ์ฆ ์ฝ๋๋ฅผ ์ ๊ณตํ๋ ID ๊ณต๊ธ์ ์๋ํฌ์ธํธ์ ๋๋ค. Snowflake๋ฅผ ID ๊ณต๊ธ์๋ก ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ด ๊ฐ์
server
๋๋account
๋งค๊ฐ ๋ณ์์์ ํ์๋ฉ๋๋ค.oauth_token_request_url
๋๋ผ์ด๋ฒ์ ์ก์ธ์ค ํ ํฐ์ ์ ๊ณตํ๋ ID ๊ณต๊ธ์ ์๋ํฌ์ธํธ์ ๋๋ค. Snowflake๋ฅผ ID ๊ณต๊ธ์๋ก ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ด ๊ฐ์
server
๋๋account
๋งค๊ฐ ๋ณ์์์ ํ์๋ฉ๋๋ค.oauth_scope
ID ๊ณต๊ธ์ ์น์ธ ์์ฒญ์์ ์์ฒญ๋ ๋ฒ์์ ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ์ญํ ์์ ํ์๋ฉ๋๋ค. ์ฌ๋ฌ ๋ฒ์๊ฐ ์๊ตฌ๋๋ ๊ฒฝ์ฐ ๊ฐ์ ๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถ๋ ์ฌ๋ฌ ๋ฒ์์ ๋ชฉ๋ก์ด์ด์ผ ํฉ๋๋ค.
oauth_redirect_uri
์ธ์ฆ ์ฝ๋ ๋ฆฌ๋๋ ์ ์ ์ฌ์ฉํ๋ URI (Snowflake ๋ณด์ ํตํฉ ๋ฉํ๋ฐ์ดํฐ)์ ๋๋ค. ๊ธฐ๋ณธ๊ฐ:
http://127.0.0.1:{randomAvailablePort}/
.oauth_disable_pkce:
์ ์์ ์ธ ๊ณต๊ฒฉ์๊ฐ ์ธ์ฆ ์ฝ๋๋ฅผ ๊ฐ๋ก์ฑ๋๋ผ๋ ์ ํจํ ์ก์ธ์ค ํ ํฐ์ผ๋ก ๋ณ๊ฒฝํ ์ ์๋๋ก ํ๋ ๋ณด์ ๊ฐ์ ์ฌํญ์ธ PKCE (Proof Key for Code Exchange)๋ฅผ ๋นํ์ฑํํฉ๋๋ค.
oauth_enable_refresh_token:
์ค์ ์ก์ธ์ค ํ ํฐ์ด ์ค๋๋์์ ๋ ์๋ ์ฌ์ธ์ฆ์ ํ์ฑํํฉ๋๋ค(์ธ์ฆ ์๋ฒ์์ ์ง์๋๊ณ
client_store_temporary_credential
์ดTrue
๋ก ์ค์ ๋์ด ์๋ ๊ฒฝ์ฐ).oauth_enable_single_use_refresh_tokens:
์ผํ์ฉ ์๋ก ๊ณ ์นจ ํ ํฐ ์๋งจํฑ์ ์ตํธ์ธํ ์ง ์ฌ๋ถ์ ๋๋ค.
์์ฑยถ
- Error, Warning, ...
Python ๋ฐ์ดํฐ๋ฒ ์ด์ค API ํ์ค์ ์ํด ์ ์๋๋ ๋ชจ๋ ์์ธ ํด๋์ค์ ๋๋ค. Python์ฉ Snowflake ์ปค๋ฅํฐ๋
msg
,errno
,sqlstate
,sfqid
๋ฐraw_msg
์์ฑ์ ์ ๊ณตํฉ๋๋ค.
account
๋งค๊ฐ ๋ณ์์ ๋ํ ์ฌ์ฉ๋ฒ ๋
ธํธ(connect
๋ฉ์๋์ฉ)ยถ
ํ์ account
๋งค๊ฐ ๋ณ์์ ๊ฒฝ์ฐ, ๊ณ์ ์๋ณ์ ๋ฅผ ์ง์ ํฉ๋๋ค.
๊ณ์ ์๋ณ์์๋ snowflakecomputing.com
๋๋ฉ์ธ ์ด๋ฆ์ด ํฌํจ๋์ง ์๋๋ค๋ ์ ์ ์ ์ํ์ญ์์ค. ์ฐ๊ฒฐ์ ์์ฑํ ๋ Snowflake๊ฐ ์ด ๊ฐ์ ์๋์ผ๋ก ์ถ๊ฐํฉ๋๋ค.
๋ค์ ์์์๋ ์กฐ์ง myorganization
์ ๊ณ์ myaccount
์ ๋ํ ์๋ณ์๋ก ๊ณ์ ์ด๋ฆ ์ ์ฌ์ฉํฉ๋๋ค.
ctx = snowflake.connector.connect(
user='<user_name>',
password='<password>',
account='myorganization-myaccount',
... )
๋ค์ ์์์๋ ๊ณ์ ๋ก์ผ์ดํฐ xy12345
๋ฅผ ๊ณ์ ์๋ณ์๋ก ์ฌ์ฉํฉ๋๋ค.
ctx = snowflake.connector.connect(
user='<user_name>',
password='<password>',
account='xy12345',
... )
์ด ์์์๋ AWS US ์๋ถ(์ค๋ ๊ณค) ๋ฆฌ์ ์ ๊ณ์ ์ ์ฌ์ฉํจ์ ์ ์ํ์ญ์์ค. ๊ณ์ ์ด ๋ค๋ฅธ ๋ฆฌ์ ์ ์๊ฑฐ๋ ๊ณ์ ์ด ๋ค๋ฅธ ํด๋ผ์ฐ๋ ๊ณต๊ธ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๊ณ์ ๋ก์ผ์ดํฐ ๋ค์์ ์ถ๊ฐ ์ธ๊ทธ๋จผํธ๋ฅผ ์ง์ ํด์ผ ํฉ๋๋ค.
์ค๋ธ์ ํธ: Connection
ยถ
Connection
์ค๋ธ์ ํธ์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ์ ํ์ฑ ์ํ๋ก ์ ์งํ๊ธฐ ์ํ ์ฐ๊ฒฐ ๋ฐ ์ธ์
์ ๋ณด๊ฐ ์์ต๋๋ค. ์ฐ๊ฒฐ์ด ์ข
๋ฃ๋๊ฑฐ๋ ์ธ์
์ด ๋ง๋ฃ๋๋ฉด ์ดํ์ ๋ชจ๋ ์์
์ด ์คํจํ๊ฒ ๋ฉ๋๋ค.
๋ฉ์๋ยถ
- autocommit(True|False)ยถ
- ๋ชฉ์ :
์๋ ์ปค๋ฐ ๋ชจ๋๋ฅผ ํ์ฑํํ๊ฑฐ๋ ๋นํ์ฑํํฉ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ์๋ ์ปค๋ฐ์ ํ์ฑํ(
True
)๋ฉ๋๋ค.
- close()ยถ
- ๋ชฉ์ :
์ฐ๊ฒฐ์ ์ข ๋ฃํฉ๋๋ค. ์ฐ๊ฒฐ์ด ์ข ๋ฃ๋์์ ๋์๋ ์ฌ์ ํ ํธ๋์ญ์ ์ด ์ฐ๊ฒฐ๋์ด ์์ผ๋ฉด ๋ณ๊ฒฝ ์ฌํญ์ด ๋กค๋ฐฑ๋ฉ๋๋ค.
์ฐ๊ฒฐ์ ๋ช ์์ ์ผ๋ก ์ข ๋ฃํ๋ฉด ์๋ฒ์์ ํ์ฑ ์ธ์ ์ด ์ ๊ฑฐ๋๋ฉฐ, ๊ทธ๋ ์ง ์์ผ๋ฉด ์๋ฒ์์ ์ญ์ ๋ ๋๊น์ง ํ์ฑ ์ธ์ ์ด ์ ์ง๋์ด, ๋์ ์ฟผ๋ฆฌ์ ์๊ฐ ์ ํ๋ฉ๋๋ค.
์:
# context manager ensures the connection is closed with snowflake.connector.connect(...) as con: con.cursor().execute(...) # try & finally to ensure the connection is closed. con = snowflake.connector.connect(...) try: con.cursor().execute(...) finally: con.close()
- commit()ยถ
- ๋ชฉ์ :
์๋ ์ปค๋ฐ์ด ๋นํ์ฑํ๋๋ฉด ํ์ฌ ํธ๋์ญ์ ์ด ์ปค๋ฐ๋ฉ๋๋ค. ์๋ ์ปค๋ฐ์ด ํ์ฑํ๋๋ฉด ์ด ๋ฉ์๋๊ฐ ๋ฌด์๋ฉ๋๋ค.
- rollback()ยถ
- ๋ชฉ์ :
์๋ ์ปค๋ฐ์ด ๋นํ์ฑํ๋๋ฉด ํ์ฌ ํธ๋์ญ์ ์ด ๋กค๋ฐฑ๋ฉ๋๋ค. ์๋ ์ปค๋ฐ์ด ํ์ฑํ๋๋ฉด ์ด ๋ฉ์๋๊ฐ ๋ฌด์๋ฉ๋๋ค.
- cursor()ยถ
- ๋ชฉ์ :
Cursor
์ค๋ธ์ ํธ๋ฅผ ์์ฑํ๊ธฐ ์ํ ์์ฑ์์ ๋๋ค.fetch*()
ํธ์ถ์ ๋ฐํ ๊ฐ์ ๋จ์ผ ์ํ์ค ๋๋ ์ํ์ค์ ๋ชฉ๋ก์ ๋๋ค.
- cursor(snowflake.connector.DictCursor)
- ๋ชฉ์ :
DictCursor
์ค๋ธ์ ํธ๋ฅผ ์์ฑํ๊ธฐ ์ํ ์์ฑ์์ ๋๋ค.fetch*()
ํธ์ถ์ ๋ฐํ ๊ฐ์ ๋จ์ผ dict ๋๋ dict ์ค๋ธ์ ํธ์ ๋ชฉ๋ก์ ๋๋ค. ์ด ๋ฉ์๋๋ ๊ฒฐ๊ณผ์์ ์ด ์ด๋ฆ์ ๊ธฐ์ค์ผ๋ก ๊ฐ์ ๊ฐ์ ธ์ฌ ๋ ์ ์ฉํฉ๋๋ค.
- execute_string(sql_text, remove_comments=False, return_cursors=True)ยถ
- ๋ชฉ์ :
๋ฌธ์์ด๋ก ์ ๋ฌ๋๋ 1๊ฐ ์ด์์ SQL ๋ฌธ์ ์คํํฉ๋๋ค.
remove_comments
๊ฐTrue
๋ก ์ค์ ๋ ๊ฒฝ์ฐ ์ฟผ๋ฆฌ์์ ์ค๋ช ์ด ์ ๊ฑฐ๋ฉ๋๋ค.return_cursors
๊ฐTrue
๋ก ์ค์ ๋ ๊ฒฝ์ฐ ์ด ๋ฉ์๋๋ ์คํ ์์๋กCursor
์ค๋ธ์ ํธ์ ์ํ์ค๋ฅผ ๋ฐํํฉ๋๋ค.- ์:
์ด ์์์๋ ๋จ์ผ ๋ฌธ์์ด์์์ ๋ค์ค ๋ช ๋ น ์คํ ๋ฐ ๋ฐํ๋๋ ์ปค์์ ์ํ์ค ์ฌ์ฉ์ ๋ณด์ฌ์ค๋๋ค.
cursor_list = connection1.execute_string( "SELECT * FROM testtable WHERE col1 LIKE 'T%';" "SELECT * FROM testtable WHERE col2 LIKE 'A%';" ) for cursor in cursor_list: for row in cursor: print(row[0], row[1])
์ฐธ๊ณ
๋จ์ผ ๋ฌธ์์ด์์ ์ฌ๋ฌ SQL ๋ฌธ์ ํ์ฉํ๋
execute_string()
๋ฑ์ ๋ฉ์๋๋ SQL ์ฝ์ ๊ณต๊ฒฉ์ ์ทจ์ฝํฉ๋๋ค. ์ฌ์ฉ์ ๋ฐ์ดํฐ์ ์ ํจ์ฑ์ ๊ฒ์ฌํ ๊ฒฝ์ฐ๋ฅผ ์ ์ธํ๊ณ ์ฌ์ฉ์๊ฐ ์ ๊ณตํ ๋ฐ์ดํฐ์ SQL์ ๊ฒฐํฉํ์ฌ SQL ๋ฌธ์ ๋์ ์ผ๋ก ๊ตฌ์ฑํ๋ ค๋ฉด, ๋ฌธ์์ด ์ฐ๊ฒฐ ๋๋ Python์format()
๋ฑ์ ํจ์๋ฅผ ์ฌ์ฉํ์ง ๋ง์ญ์์ค. ์๋ ์๋ ๋ฌธ์ ๋ฅผ ๋ณด์ฌ์ค๋๋ค.# "Binding" data via the format() function (UNSAFE EXAMPLE) value1_from_user = "'ok3'); DELETE FROM testtable WHERE col1 = 'ok1'; select pi(" sql_cmd = "insert into testtable(col1) values('ok1'); " \ "insert into testtable(col1) values('ok2'); " \ "insert into testtable(col1) values({col1});".format(col1=value1_from_user) # Show what SQL Injection can do to a composed statement. print(sql_cmd) connection1.execute_string(sql_cmd)
๋์ ์ผ๋ก ๊ตฌ์ฑ๋ ๋ฌธ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค(๊ฐ๋ ์ฑ์ ์ํด ์ค ๋ฐ๊ฟ์ด ์ถ๊ฐ๋จ).
insert into testtable(col1) values('ok1'); insert into testtable(col1) values('ok2'); insert into testtable(col1) values('ok3'); DELETE FROM testtable WHERE col1 = 'ok1'; select pi();
์ ๋ขฐํ ์ ์๋ ์ฌ์ฉ์๊ฐ ์ ๋ ฅํ ๋ฌธ์์ด๊ณผ SQL ๋ฌธ์ ๊ฒฐํฉํ๋ ๊ฒฝ์ฐ์๋ ๋ฌธ์์ด์ ๊ตฌ์ฑํ๋ ๋์ ๋ฐ์ดํฐ๋ฅผ ๋ฌธ์ ๋ฐ์ธ๋ฉํ๋ ๊ฒ์ด ์์ ํฉ๋๋ค.
execute_string()
๋ฉ์๋์์๋ ๋ฐ์ธ๋ฉ ๋งค๊ฐ ๋ณ์๊ฐ ์ฌ์ฉ๋์ง ์์ผ๋ฏ๋กCursor.execute()
๋๋Cursor.executemany()
๋ฅผ ์ฌ์ฉํ์ฌ ๋งค๊ฐ ๋ณ์๋ฅผ ๋ฐ์ธ๋ฉํฉ๋๋ค.
- execute_stream(sql_stream, remove_comments=False)ยถ
- ๋ชฉ์ :
์คํธ๋ฆผ ์ค๋ธ์ ํธ๋ก ์ ๋ฌ๋ 1๊ฐ ์ด์์ SQL ๋ฌธ์ ์คํํฉ๋๋ค.
remove_comments
๊ฐTrue
๋ก ์ค์ ๋ ๊ฒฝ์ฐ ์ฟผ๋ฆฌ์์ ์ค๋ช ์ด ์ ๊ฑฐ๋ฉ๋๋ค. ์ด ์์ฑ๊ธฐ์์๋ SQL ๋ฌธ์ด ์คํ๋ ๋ ๊ฐCursor
์ค๋ธ์ ํธ๊ฐ ์์ฑ๋ฉ๋๋ค.sql_stream
์ด ์ฃผ์ ์ค๋ก ๋๋๋ ๊ฒฝ์ฐ ๋ค์๊ณผ ์ ์ฌํ๊ฒremove_comments
๋ฅผTrue
๋ก ์ค์ ํด์ผ ํฉ๋๋ค.sql_script = """ -- This is first comment line; select 1; select 2; -- This is comment in middle; -- With some extra comment lines; select 3; -- This is the end with last line comment; """ sql_stream = StringIO(sql_script) with con.cursor() as cur: for result_cursor in con.execute_stream(sql_stream,remove_comments=True): for result in result_cursor: print(f"Result: {result}")
- get_query_status(query_id)ยถ
- ๋ชฉ์ :
์ฟผ๋ฆฌ์ ์ํ๋ฅผ ๋ฐํํฉ๋๋ค.
- ๋งค๊ฐ ๋ณ์:
query_id
์ฟผ๋ฆฌ์ ID์ ๋๋ค. Snowflake ์ฟผ๋ฆฌ ID ๊ฒ์ํ๊ธฐ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
- ๋ฐํ:
์ฟผ๋ฆฌ์ ์ํ๋ฅผ ๋ํ๋ด๋
QueryStatus
์ค๋ธ์ ํธ๋ฅผ ๋ฐํํฉ๋๋ค.- ์:
์ฟผ๋ฆฌ ์ํ ํ์ธํ๊ธฐ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
- get_query_status_throw_if_error(query_id)ยถ
- ๋ชฉ์ :
์ฟผ๋ฆฌ์ ์ํ๋ฅผ ๋ฐํํฉ๋๋ค. ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ์ ์ค๋ฅ๊ฐ ์๋ ๊ฒฝ์ฐ ์ด ๋ฉ์๋์์๋
ProgrammingError
๊ฐ ๋ฐ์ํฉ๋๋ค(execute()
๋ฉ์๋์์์ ๊ฐ์ด).- ๋งค๊ฐ ๋ณ์:
query_id
์ฟผ๋ฆฌ์ ID์ ๋๋ค. Snowflake ์ฟผ๋ฆฌ ID ๊ฒ์ํ๊ธฐ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
- ๋ฐํ:
์ฟผ๋ฆฌ์ ์ํ๋ฅผ ๋ํ๋ด๋
QueryStatus
์ค๋ธ์ ํธ๋ฅผ ๋ฐํํฉ๋๋ค.- ์:
์ฟผ๋ฆฌ ์ํ ํ์ธํ๊ธฐ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
- is_valid()ยถ
- ๋ชฉ์ :
์ฐ๊ฒฐ์ด ์ฟผ๋ฆฌ๋ฅผ ์์ ํ ์ ์์ ๋งํผ ์์ ์ ์ด๋ฉด
True
๋ฅผ ๋ฐํํฉ๋๋ค.
- is_still_running(query_status)ยถ
- ๋ชฉ์ :
์ฟผ๋ฆฌ ์ํ๊ฐ ์ฟผ๋ฆฌ๊ฐ ์์ง ์๋ฃ๋์ง ์์ ๋๋ ์์ง ์งํ ์ค์ผ๋ก ํ์๋๋ฉด
True
๊ฐ ๋ฐํ๋ฉ๋๋ค.- ๋งค๊ฐ ๋ณ์:
query_status
์ฟผ๋ฆฌ์ ์ํ๋ฅผ ๋ํ๋ด๋
QueryStatus
์ค๋ธ์ ํธ์ ๋๋ค. ์ฟผ๋ฆฌ์ ๋ํ ์ด ์ค๋ธ์ ํธ๋ฅผ ๊ฐ์ ธ์ค๋ ค๋ฉด, ์ฟผ๋ฆฌ ์ํ ํ์ธํ๊ธฐ ๋ฅผ ์ฐธ์กฐํ์ญ์์ค.- ์:
์ฟผ๋ฆฌ ์ํ ํ์ธํ๊ธฐ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
- is_an_error(query_status)ยถ
- ๋ชฉ์ :
์ฟผ๋ฆฌ ์ํ๊ฐ ์ฟผ๋ฆฌ์์ ์ค๋ฅ๊ฐ ๋ฐ์ํจ์ผ๋ก ํ์๋๋ฉด
True
๊ฐ ๋ฐํ๋ฉ๋๋ค.- ๋งค๊ฐ ๋ณ์:
query_status
์ฟผ๋ฆฌ์ ์ํ๋ฅผ ๋ํ๋ด๋
QueryStatus
์ค๋ธ์ ํธ์ ๋๋ค. ์ฟผ๋ฆฌ์ ๋ํ ์ด ์ค๋ธ์ ํธ๋ฅผ ๊ฐ์ ธ์ค๋ ค๋ฉด, ์ฟผ๋ฆฌ ์ํ ํ์ธํ๊ธฐ ๋ฅผ ์ฐธ์กฐํ์ญ์์ค.- ์:
์ฟผ๋ฆฌ ์ํ ํ์ธํ๊ธฐ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
์์ฑยถ
- expiredยถ
์ฐ๊ฒฐ์ ๋ง์คํฐ ํ ํฐ์ด ๋ง๋ฃ๋์๋์ง ์ฌ๋ถ๋ฅผ ์ถ์ ํฉ๋๋ค.
- messagesยถ
์ด ์ฐ๊ฒฐ์ ๋ํ ๊ธฐ๋ณธ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก๋ถํฐ ์์ ๋ ๋ชจ๋ ๋ฉ์์ง์ ๋ํ ์ํ์ค(์์ธ ํด๋์ค, ์์ธ ๊ฐ)๋ฅผ ํฌํจํ๋ ๋ชฉ๋ก ์ค๋ธ์ ํธ์ ๋๋ค.
๋ชฉ๋ก์ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด ์๋์ผ๋ก ์ญ์ ๋ฉ๋๋ค.
- errorhandlerยถ
์ค๋ฅ ์กฐ๊ฑด์ด ์ถฉ์กฑ๋ ๋ ํธ์ถํ ์ค๋ฅ ์ฒ๋ฆฌ๊ธฐ๋ฅผ ์ฐธ์กฐํ๋ ์ฝ๊ธฐ/์ฐ๊ธฐ ์์ฑ์ ๋๋ค.
์ด ์ฒ๋ฆฌ๊ธฐ๋ ๋ค์ ์ธ์๋ฅผ ํ์ฉํ๊ณ Python์์ ํธ์ถํ ์ ์์ด์ผ ํฉ๋๋ค.
errorhandler(connection, cursor, errorclass, errorvalue)
- Error, Warning, ...
Python ๋ฐ์ดํฐ๋ฒ ์ด์ค API ํ์ค์ ์ํด ์ ์๋๋ ๋ชจ๋ ์์ธ ํด๋์ค์ ๋๋ค.
์ค๋ธ์ ํธ: Cursor
ยถ
Cursor
์ค๋ธ์ ํธ๋ ์คํ ๋ฐ ํ์น ์์
์ ์ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ปค์๋ฅผ ๋ํ๋
๋๋ค. ๊ฐ ์ปค์์๋ ์์ฒด ์์ฑ์ธ description
๋ฐ rowcount
๊ฐ ์์ด, ์ปค์๋ฅผ ๋ถ๋ฆฌํ ์ ์์ต๋๋ค.
๋ฉ์๋ยถ
- close()
- ๋ชฉ์ :
์ปค์ ์ค๋ธ์ ํธ๋ฅผ ๋ซ์ต๋๋ค.
- describe(command [, parameters][, timeout][, file_stream])ยถ
- ๋ชฉ์ :
๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ช ๋ น์ ์คํํ์ง ์๊ณ ๊ฒฐ๊ณผ ์ธํธ์ ๋ํ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ๋ฐํํฉ๋๋ค. ๋ฏธ ๋ฉ์๋๋ ์ฟผ๋ฆฌ๋ฅผ ์คํํ ํ
description
์์ฑ์์ ์ฌ์ฉํ ์ ์๋ ๋์ผํ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ๋ฐํํฉ๋๋ค.์ด ๋ฉ์๋๋ Python์ฉ Snowflake ์ปค๋ฅํฐ์ 2.4.6 ๋ฒ์ ์์ ๋์ ๋์์ต๋๋ค.
- ๋งค๊ฐ ๋ณ์:
execute()
๋ฉ์๋์ ๋ํ ๋งค๊ฐ ๋ณ์๋ฅผ ์ฐธ์กฐํ์ญ์์ค.- ๋ฐํ:
๊ฒฐ๊ณผ ์ธํธ์ ์ด์ ์ค๋ช ํ๋ ResultMetadata ์ค๋ธ์ ํธ์ ๋ชฉ๋ก์ ๋ฐํํฉ๋๋ค.
- ์:
์ด ๋ฉํ๋ฐ์ดํฐ ๊ฒ์ํ๊ธฐ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
- execute(command [, parameters][, timeout][, file_stream])ยถ
- ๋ชฉ์ :
๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ช ๋ น์ ์ค๋นํ์ฌ ์คํํฉ๋๋ค.
- ๋งค๊ฐ ๋ณ์:
command
์คํํ SQL ๋ฌธ์ด ํฌํจ๋ ๋ฌธ์์ด์ ๋๋ค.
parameters
(์ ํ ์ฌํญ) SQL ๋ฌธ์์ ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ ์ ์ํด ๋งค๊ฐ ๋ณ์๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ, ์ด ๊ฐ์ ํด๋น ๋งค๊ฐ ๋ณ์์ ๋ฐ์ธ๋ฉํด์ผ ํ๋ ๋ณ์์ ๋ชฉ๋ก ๋๋ ๋์ ๋๋ฆฌ๋ก ์ค์ ํฉ๋๋ค.
๋ณ์์ ๋ํ Python ๋ฐ์ดํฐ ํ์ ์ ํด๋น ์ด์ SQL ๋ฐ์ดํฐ ํ์ ์ผ๋ก ๋งคํํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์์ธํ ๋ด์ฉ์ qmark ๋ฐ numeric ๋ฐ์ธ๋ฉ์ฉ ๋ฐ์ดํฐ ํ์ ๋งคํ ์ ์ฐธ์กฐํ์ญ์์ค.
timeout
(์ ํ ์ฌํญ) ์ฟผ๋ฆฌ๊ฐ ์๋ฃ๋ ๋๊น์ง ๋๊ธฐํด์ผ ํ๋ ์๊ฐ(์ด)์ ๋๋ค. ์ด ์๊ฐ์ ๊ฒฝ๊ณผํ ํ์ ์ฟผ๋ฆฌ๊ฐ ์๋ฃ๋์ง ์์ผ๋ฉด ์ฟผ๋ฆฌ๊ฐ ์ค๋จ๋์ด์ผ ํฉ๋๋ค.
file_stream
(์ ํ ์ฌํญ) PUT ๋ช ๋ น์ ์คํํ ๋ ์ด ๋งค๊ฐ ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ํ์ผ ์์คํ ์ ํ์ผ์ด ์๋ ์ธ๋ฉ๋ชจ๋ฆฌ ํ์ผ๊ณผ ์ ์ฌํ ์ค๋ธ์ ํธ(์: Python
open()
ํจ์์์ ๋ฐํ๋ I/O ์ค๋ธ์ ํธ)๋ฅผ ์ ๋ก๋ํ ์ ์์ต๋๋ค. ์ด ๋งค๊ฐ ๋ณ์๋ฅผ ํด๋น I/O ์ค๋ธ์ ํธ๋ก ์ค์ ํฉ๋๋ค.PUT ๋ช ๋ น์์ ๋ฐ์ดํฐ ํ์ผ์ URI๋ฅผ ์ง์ ํ ๋:
์ฌ์ฉ์๋ ๋๋ ํฐ๋ฆฌ ๊ฒฝ๋ก๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. URI์ ์ง์ ํ๋ ๋๋ ํฐ๋ฆฌ ๊ฒฝ๋ก๋ ๋ฌด์๋ฉ๋๋ค.
์คํ ์ด์ง์์ ์์ฑํด์ผ ํ๋ ํ์ผ์ ์ด๋ฆ์ ํ์ผ ์ด๋ฆ์ ์ง์ ํฉ๋๋ค.
์๋ฅผ ๋ค์ด, ํ์ผ ์คํธ๋ฆผ์์ ๋ค์ ์ด๋ฆ์ ํ์ผ๋ก ํ์ผ์ ์ ๋ก๋ํ๋ ค๋ฉด:
@mystage/myfile.csv
๋ค์ ํธ์ถ ์ฌ์ฉ:
cursor.execute( "PUT file://this_directory_path/is_ignored/myfile.csv @mystage", file_stream=<io_object>)
- ๋ฐํ:
Cursor
์ค๋ธ์ ํธ์ ์ฐธ์กฐ๋ฅผ ๋ฐํํฉ๋๋ค.
- executemany(command, seq_of_parameters)ยถ
- ๋ชฉ์ :
๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ช ๋ น์ ์ค๋นํ๊ณ
seq_of_parameters
์ ๋ชจ๋ ๋งค๊ฐ ๋ณ์ ์ํ์ค์ ๋ํ์ฌ ์คํํฉ๋๋ค. ์ด ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ์ผ๊ด ์ฝ์ ์์ ์ ์ํํ ์ ์์ต๋๋ค.- ๋งค๊ฐ ๋ณ์:
command
๋ช ๋ น์ ์คํ๋ ์ฝ๋๊ฐ ํฌํจ๋ ๋ฌธ์์ด์ ๋๋ค. ๋ฌธ์์ด์๋ ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉํ๊ธฐ ์ ๋ํ 1๊ฐ ์ด์์ ์๋ฆฌ ํ์์(์: ๋ฌผ์ํ)๊ฐ ํฌํจ๋์ด์ผ ํฉ๋๋ค.
์:
"insert into testy (v1, v2) values (?, ?)"
seq_of_parameters
์ด ๋งค๊ฐ ๋ณ์๋ ๋ชฉ๋ก ๋๋ ํํ์ ์ํ์ค(๋ชฉ๋ก ๋๋ ํํ)์ฌ์ผ ํฉ๋๋ค. ์์ ์ํ์ค๋ ์๋์ ์์ ์ฝ๋๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
- ๋ฐํ:
Cursor
์ค๋ธ์ ํธ์ ์ฐธ์กฐ๋ฅผ ๋ฐํํฉ๋๋ค.- ์:
# This example uses qmark (question mark) binding, so # you must configure the connector to use this binding style. from snowflake import connector connector.paramstyle='qmark' stmt1 = "create table testy (V1 varchar, V2 varchar)" cs.execute(stmt1) # A list of lists sequence_of_parameters1 = [ ['Smith', 'Ann'], ['Jones', 'Ed'] ] # A tuple of tuples sequence_of_parameters2 = ( ('Cho', 'Kim'), ('Cooper', 'Pat') ) stmt2 = "insert into testy (v1, v2) values (?, ?)" cs.executemany(stmt2, sequence_of_parameters1) cs.executemany(stmt2, sequence_of_parameters2)
๋ด๋ถ์ ์ผ๋ก ์ฌ๋ฌ
execute
๋ฉ์๋๋ฅผ ํธ์ถํ ์ ์์ผ๋ฉฐ ๋ง์ง๋งexecute
ํธ์ถ์ ๊ฒฐ๊ณผ ์ธํธ๊ฐ ์ ์ง๋ฉ๋๋ค.์ฐธ๊ณ
executemany
๋ฉ์๋๋ง์ ์ฌ์ฉํ์ฌ ๋งค๊ฐ ๋ณ์๊ฐ ์๋ ๋จ์ผ SQL ๋ฌธ์ ์คํํ๊ณ ์ฌ๋ฌ ๋ฐ์ธ๋ฉ ๊ฐ์ ์ ๋ฌํ ์ ์์ต๋๋ค.1๊ฐ์
execute
ํธ์ถ์์ ์ธ๋ฏธ์ฝ๋ก ์ผ๋ก ๊ตฌ๋ถ๋ ์ฌ๋ฌ SQL ๋ฌธ์ ์คํํ๋ ๊ธฐ๋ฅ์ ์ง์๋์ง ์์ต๋๋ค. ๋์ , ๊ฐ ๋ฌธ์ ๋ณ๋์execute
ํธ์ถ์ ์ํํด์ผ ํฉ๋๋ค.
- execute_async(...)ยถ
- ๋ชฉ์ :
๋น๋๊ธฐ ์คํ์ ์ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ช ๋ น์ ์ค๋นํ์ฌ ์ ์ถํด์ผ ํฉ๋๋ค. ๋น๋๊ธฐ ์ฟผ๋ฆฌ ์ํํ๊ธฐ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
- ๋งค๊ฐ ๋ณ์:
์ด ๋ฉ์๋์์๋
execute()
๋ฉ์๋์ ๋์ผํ ๋งค๊ฐ ๋ณ์๊ฐ ์ฌ์ฉ๋ฉ๋๋ค.- ๋ฐํ:
Cursor
์ค๋ธ์ ํธ์ ์ฐธ์กฐ๋ฅผ ๋ฐํํฉ๋๋ค.- ์:
๋น๋๊ธฐ ์ฟผ๋ฆฌ์ ์ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
- fetch_arrow_all()ยถ
- ๋ชฉ์ :
์ด ๋ฉ์๋๋ ์ปค์์์ ๋ชจ๋ ํ์ ๊ฐ์ ธ์ PyArrow ํ ์ด๋ธ๋ก ๋ก๋ฉํฉ๋๋ค.
- ๋งค๊ฐ ๋ณ์:
์์ต๋๋ค.
- ๋ฐํ:
๊ฒฐ๊ณผ ์ธํธ์์ ๋ชจ๋ ํ์ด ํฌํจ๋ PyArrow ํ ์ด๋ธ์ ๋ฐํํฉ๋๋ค.
ํ์ด ์์ผ๋ฉด None์ด ๋ฐํ๋ฉ๋๋ค.
- ์:
Python์ฉ Snowflake ์ปค๋ฅํฐ๋ก ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ ธ์ค๋ ์ํฌ๋ก๋ ๋ถ์ฐํ๊ธฐ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
- fetch_arrow_batches()ยถ
- ๋ชฉ์ :
์ด ๋ฉ์๋๋ ์ปค์์์ ํ์ ํ์ ์ธํธ๋ฅผ ๊ฐ์ ธ์ PyArrow ํ ์ด๋ธ๋ก ์ ๋ฌํฉ๋๋ค.
- ๋งค๊ฐ ๋ณ์:
์์ต๋๋ค.
- ๋ฐํ:
๊ฒฐ๊ณผ ์ธํธ์์ ํ์ ์ธํธ๊ฐ ํฌํจ๋ PyArrow ํ ์ด๋ธ์ ๋ฐํํฉ๋๋ค.
๊ฐ์ ธ์ฌ ํ์ด ๋ ์ด์ ์๋ ๊ฒฝ์ฐ None์ด ๋ฐํ๋ฉ๋๋ค.
- ์:
Python์ฉ Snowflake ์ปค๋ฅํฐ๋ก ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ ธ์ค๋ ์ํฌ๋ก๋ ๋ถ์ฐํ๊ธฐ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
- get_result_batches()ยถ
- ๋ชฉ์ :
๊ฒฐ๊ณผ ์ธํธ์์ ํ์ ํ์ ์ธํธ๋ฅผ ๊ฐ์ ธ์ค๋ ๋ฐ ์ฌ์ฉํ ์ ์๋ ResultBatch ์ค๋ธ์ ํธ์ ๋ชฉ๋ก์ ๋ฐํํฉ๋๋ค.
- ๋งค๊ฐ ๋ณ์:
์์ต๋๋ค.
- ๋ฐํ:
ResultBatch ์ค๋ธ์ ํธ์ ๋ชฉ๋ก์ ๋ฐํํ๊ฑฐ๋ ์ฟผ๋ฆฌ๊ฐ ์คํ์ ๋ง์น์ง ์์๋ค๋ฉด
None
์ ๋ฐํํฉ๋๋ค.- ์:
Python์ฉ Snowflake ์ปค๋ฅํฐ๋ก ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ ธ์ค๋ ์ํฌ๋ก๋ ๋ถ์ฐํ๊ธฐ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
- get_results_from_sfqid(query_id)ยถ
- ๋ชฉ์ :
๋น๋๊ธฐ ์ฟผ๋ฆฌ ๋๋ ์ด์ ์ ์ ์ถํ ๋น๋๊ธฐ ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๋ฅผ ๊ฒ์ํฉ๋๋ค.
- ๋งค๊ฐ ๋ณ์:
query_id
์ฟผ๋ฆฌ์ ID์ ๋๋ค. Snowflake ์ฟผ๋ฆฌ ID ๊ฒ์ํ๊ธฐ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
- ์:
์ฟผ๋ฆฌ ID๋ฅผ ์ฌ์ฉํ์ฌ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ ๊ฒ์ํ๊ธฐ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
- fetchone()ยถ
- ๋ชฉ์ :
์ฟผ๋ฆฌ ๊ฒฐ๊ณผ ์ธํธ์ ๋ค์ ํ์ ๊ฐ์ ธ์ค๊ณ ๋ ์ด์ ์ฌ์ฉํ ์ ์๋ ๋ฐ์ดํฐ๊ฐ ์๋ ๊ฒฝ์ฐ ๋จ์ผ ์ํ์ค/dict ๋๋
None
์ ๋ฐํํฉ๋๋ค.
- fetchmany([size=cursor.arraysize])ยถ
- ๋ชฉ์ :
์ฟผ๋ฆฌ ๊ฒฐ๊ณผ ์ธํธ์ ๋ค์ ํ์ ๊ฐ์ ธ์ค๊ณ ์ํ์ค/dict์ ๋ชฉ๋ก์ ๋ฐํํฉ๋๋ค. ์ฌ์ฉํ ์ ์๋ ํ์ด ๋ ์ด์ ์๋ ๊ฒฝ์ฐ์๋ ๋น ์ํ์ค๊ฐ ๋ฐํ๋ฉ๋๋ค.
- fetchall()ยถ
- ๋ชฉ์ :
์ฟผ๋ฆฌ ๊ฒฐ๊ณผ ์ธํธ์ ๋ชจ๋ ๋๋ ๋๋จธ์ง ํ์ ๊ฐ์ ธ์ค๊ณ ์ํ์ค/dict์ ๋ชฉ๋ก์ ๋ฐํํฉ๋๋ค.
- fetch_pandas_all()ยถ
- ๋ชฉ์ :
์ด ๋ฉ์๋๋ ์ปค์์์ ๋ชจ๋ ํ์ ๊ฐ์ ธ์ pandas DataFrame์ผ๋ก ๋ก๋ํฉ๋๋ค.
- ๋งค๊ฐ ๋ณ์:
์์ต๋๋ค.
- ๋ฐํ:
๊ฒฐ๊ณผ ์ธํธ์์ ๋ชจ๋ ํ์ด ํฌํจ๋ DataFrame์ ๋ฐํํฉ๋๋ค.
pandas ๋ฐ์ดํฐ ํ๋ ์์ ๋ํ ์์ธํ ๋ด์ฉ์ pandas DataFrame ์ค๋ช ์๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
ํ์ด ์์ผ๋ฉด
None
์ด ๋ฐํ๋ฉ๋๋ค.
- ์ฌ์ฉ๋ฒ ๋ ธํธ:
์ด ๋ฉ์๋๋ pandas์
read_sql()
๋ฉ์๋๋ฅผ ์์ ํ๊ฒ ๋์ฒดํ์ง ์์ผ๋ฉฐ, ์ด ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด SELECT ์ฟผ๋ฆฌ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ ๋ฐ์ดํฐ๋ฅผ pandas DataFrame์ ์ ์ฅํ๋ ์์ ์ ๋น ๋ฅด๊ฒ ์ํํ ์ ์์ต๋๋ค.ํ์ฌ ์ด ๋ฉ์๋๋ SELECT ๋ฌธ์์๋ง ์๋ํฉ๋๋ค.
- ์:
ctx = snowflake.connector.connect( host=host, user=user, password=password, account=account, warehouse=warehouse, database=database, schema=schema, protocol='https', port=port) # Create a cursor object. cur = ctx.cursor() # Execute a statement that will generate a result set. sql = "select * from t" cur.execute(sql) # Fetch the result set from the cursor and deliver it as the pandas DataFrame. df = cur.fetch_pandas_all() # ...
- fetch_pandas_batches()ยถ
- ๋ชฉ์ :
์ด ๋ฉ์๋๋ ์ปค์์์ ํ์ ํ์ ์ธํธ๋ฅผ ๊ฐ์ ธ์ pandas DataFrame์ผ๋ก ์ ๋ฌํฉ๋๋ค.
- ๋งค๊ฐ ๋ณ์:
์์ต๋๋ค.
- ๋ฐํ:
๊ฒฐ๊ณผ ์ธํธ์์ ํ์ ์ธํธ๊ฐ ํฌํจ๋ DataFrame์ ๋ฐํํฉ๋๋ค.
pandas ๋ฐ์ดํฐ ํ๋ ์์ ๋ํ ์์ธํ ๋ด์ฉ์ pandas DataFrame ์ค๋ช ์๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
๊ฐ์ ธ์ฌ ํ์ด ๋ ์ด์ ์๋ ๊ฒฝ์ฐ
None
์ด ๋ฐํ๋ฉ๋๋ค.
- ์ฌ์ฉ๋ฒ ๋ ธํธ:
๊ฒฐ๊ณผ ์ธํธ์ ํ ์ ๋ฐ ๋ฉ์๋ ํธ์ถ์ ์ง์ ๋ ํ ์์ ๋ฐ๋ผ, ์ด ๋ฉ์๋๋ฅผ ๋ ๋ฒ ์ด์ ํธ์ถํด์ผ ํ๊ฑฐ๋ ๋ชจ๋ ์ ํฉํ ๊ฒฝ์ฐ ๋จ์ผ ์ผ๊ด ์ฒ๋ฆฌ์์ ๋ชจ๋ ํ์ ๋ฐํํด์ผ ํ ์ ์์ต๋๋ค.
์ด ๋ฉ์๋๋ pandas์
read_sql()
๋ฉ์๋๋ฅผ ์์ ํ๊ฒ ๋์ฒดํ์ง ์์ผ๋ฉฐ, ์ด ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด SELECT ์ฟผ๋ฆฌ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ ๋ฐ์ดํฐ๋ฅผ pandas DataFrame์ ์ ์ฅํ๋ ์์ ์ ๋น ๋ฅด๊ฒ ์ํํ ์ ์์ต๋๋ค.ํ์ฌ ์ด ๋ฉ์๋๋ SELECT ๋ฌธ์์๋ง ์๋ํฉ๋๋ค.
- ์:
ctx = snowflake.connector.connect( host=host, user=user, password=password, account=account, warehouse=warehouse, database=database, schema=schema, protocol='https', port=port) # Create a cursor object. cur = ctx.cursor() # Execute a statement that will generate a result set. sql = "select * from t" cur.execute(sql) # Fetch the result set from the cursor and deliver it as the pandas DataFrame. for df in cur.fetch_pandas_batches(): my_dataframe_processing_function(df) # ...
- __iter__()ยถ
์ปค์๊ฐ ๋ฐ๋ณต ํ๋กํ ์ฝ๊ณผ ํธํ๋ ์ ์๋๋ก ์์ฒด๋ฅผ ๋ฐํํฉ๋๋ค.
์์ฑยถ
- descriptionยถ
๊ฒฐ๊ณผ ์ธํธ์ ์ด์ ๋ํ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ๋ฐํํ๋ ์ฝ๊ธฐ ์ ์ฉ ์์ฑ์ ๋๋ค.
์ด ์์ฑ์ ์ฟผ๋ฆฌ๋ฅผ ์คํํ๊ธฐ ์ํด
execute()
๋ฉ์๋๋ฅผ ํธ์ถํ ํ์ ์ค์ ๋ฉ๋๋ค. (2.4.6 ์ด์ ๋ฒ์ ์์๋ ์ฟผ๋ฆฌ๋ฅผ ์คํํ์ง ์๊ณdescribe()
๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ์ด ๋ฉํ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.)์ด ์์ฑ์ ๋ค์ ์ค ํ๋๋ก ์ค์ ๋ฉ๋๋ค.
2.4.5 ์ดํ ๋ฒ์ : ์ด ์์ฑ์ ํํ์ ๋ชฉ๋ก์ผ๋ก ์ค์ ๋ฉ๋๋ค.
2.4.6 ์ด์ ๋ฒ์ : ์ด ์์ฑ์ ResultMetadata ์ค๋ธ์ ํธ์ ๋ชฉ๋ก์ผ๋ก ์ค์ ๋ฉ๋๋ค.
๊ฐ ํํ ๋๋
ResultMetadata
์ค๋ธ์ ํธ์๋ ๊ฒฐ๊ณผ ์ธํธ์ ์ด์ ์ค๋ช ํ๋ ๋ฉํ๋ฐ์ดํฐ๊ฐ ํฌํจ๋ฉ๋๋ค. ์ฌ์ฉ์๋ ์ธ๋ฑ์ค๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ฉํ๋ฐ์ดํฐ์ ์ก์ธ์คํ๊ฑฐ๋ 2.4.6 ์ด์ ๋ฒ์ ์ ๊ฒฝ์ฐResultMetadata
์ค๋ธ์ ํธ ์์ฑ์ ๊ธฐ์ค์ผ๋ก ์ก์ธ์คํ ์ ์์ต๋๋ค.๊ฐ์ ์ธ๋ฑ์ค
ResultMetadata ์์ฑ
์ค๋ช
0
name
์ด ์ด๋ฆ.
1
type_code
๋ด๋ถ ํ์ ์ฝ๋.
2
display_size
(์ฌ์ฉ๋์ง ์์. ๋ด๋ถ_ํฌ๊ธฐ์ ๋์ผ.)
3
internal_size
๋ด๋ถ ๋ฐ์ดํฐ ํฌ๊ธฐ.
4
precision
์ซ์ ๋ฐ์ดํฐ์ ์ ์ฒด ์๋ฆฟ์.
5
scale
์ซ์ ๋ฐ์ดํฐ์ ์์ ์๋ฆฟ์์ ๋๋ค.
6
is_nullable
์ด ๋๋
False
์์ NULL ๊ฐ์ด ํ์ฉ๋๋ ๊ฒฝ์ฐTrue
.์ด ์์ฑ์ ๊ฐ์ ธ์ค๋ ์๋ ์ด ๋ฉํ๋ฐ์ดํฐ ๊ฒ์ํ๊ธฐ ๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
- rowcountยถ
์์ฑ๋ ๋ง์ง๋ง
execute
์์ ํ์ ์๋ฅผ ๋ฐํํ๋ ์ฝ๊ธฐ ์ ์ฉ ์์ฑ์ ๋๋ค.execute
๊ฐ ์คํ๋์ง ์์ ๊ฒฝ์ฐ ๊ฐ์-1
๋๋None
์ ๋๋ค.
- sfqidยถ
์คํ๋ ๋ง์ง๋ง
execute
๋๋execute_async
์์ Snowflake ์ฟผ๋ฆฌ ID๋ฅผ ๋ฐํํ๋ ์ฝ๊ธฐ ์ ์ฉ ์์ฑ์ ๋๋ค.
- arraysizeยถ
fetchmany()
๋ฅผ ์ฌ์ฉํ์ฌ ํ ๋ฒ์ ๊ฐ์ ธ์ฌ ํ์ ์๋ฅผ ์ง์ ํ๋ ์ฝ๊ธฐ/์ฐ๊ธฐ ์์ฑ์ ๋๋ค. ๊ธฐ๋ณธ๊ฐ์1
์ ๋๋ค. ์ฆ, ํ ๋ฒ์ 1๊ฐ์ ํ์ ๊ฐ์ ธ์ต๋๋ค.
- connectionยถ
์ปค์๊ฐ ์์ฑ๋
Connection
์ค๋ธ์ ํธ์ ๋ํ ์ฐธ์กฐ๋ฅผ ๋ฐํํ๋ ์ฝ๊ธฐ ์ ์ฉ ์์ฑ์ ๋๋ค.
- messages
์ปค์์ ๋ํ ๊ธฐ๋ณธ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก๋ถํฐ ์์ ๋ ๋ชจ๋ ๋ฉ์์ง์ ๋ํ ์ํ์ค๋ฅผ ํฌํจํ๋ ์ค๋ธ์ ํธ(์์ธ ํด๋์ค, ์์ธ ๊ฐ)๋ฅผ ๋์ดํฉ๋๋ค.
fetch*()
ํธ์ถ์ ์ ์ธํ๊ณ ๋ชฉ๋ก์ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด ์๋์ผ๋ก ์ญ์ ๋ฉ๋๋ค.
- errorhandler
์ค๋ฅ ์กฐ๊ฑด์ด ์ถฉ์กฑ๋ ๋ ํธ์ถํ ์ค๋ฅ ์ฒ๋ฆฌ๊ธฐ๋ฅผ ์ฐธ์กฐํ๋ ์ฝ๊ธฐ/์ฐ๊ธฐ ์์ฑ์ ๋๋ค.
์ด ์ฒ๋ฆฌ๊ธฐ๋ ๋ค์ ์ธ์๋ฅผ ํ์ฉํ๊ณ Python์์ ํธ์ถํ ์ ์์ด์ผ ํฉ๋๋ค.
errorhandler(connection, cursor, errorclass, errorvalue)
์ ํ ์ฝ๋ยถ
Cursor
์ค๋ธ์ ํธ์์ description
์์ฑ ๋ฐ describe()
๋ฉ์๋๋ ๊ฒฐ๊ณผ ์ธํธ์ ์ด์ ์ค๋ช
ํ๋ ํํ์ ๋ชฉ๋ก(๋๋ 2.4.6 ์ด์ ๋ฒ์ ์ ๊ฒฝ์ฐ ResultMetadata ์ค๋ธ์ ํธ)์ ์ ๊ณตํฉ๋๋ค.
ํํ์์ ์ธ๋ฑ์ค 1
์ ๊ฐ(ResultMetadata
์ค๋ธ์ ํธ์ type_code
์์ฑ)์ ์ด ๋ฐ์ดํฐ ํ์
์ ๋ํ๋
๋๋ค. Python์ฉ Snowflake ์ปค๋ฅํฐ์์ ํ์
์ฝ๋์ ๋ฐ๋ผ ๋ฌธ์์ด ํํ์ ๊ฐ์ ธ์ค๊ธฐ ์ํด ์ฌ์ฉํ๋ ๋งคํ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
ํ์ _์ฝ๋ |
๋ฌธ์์ด ํํ |
๋ฐ์ดํฐ ํ์ |
---|---|---|
0 |
FIXED |
NUMBER/INT |
1 |
REAL |
REAL |
2 |
TEXT |
VARCHAR/STRING |
3 |
DATE |
DATE |
4 |
TIMESTAMP |
TIMESTAMP |
5 |
VARIANT |
VARIANT |
6 |
TIMESTAMP_LTZ |
TIMESTAMP_LTZ |
7 |
TIMESTAMP_TZ |
TIMESTAMP_TZ |
8 |
TIMESTAMP_NTZ |
TIMESTAMP_TZ |
9 |
OBJECT |
OBJECT |
10 |
ARRAY |
ARRAY |
11 |
BINARY |
BINARY |
12 |
TIME |
TIME |
13 |
BOOLEAN |
BOOLEAN |
14 |
GEOGRAPHY |
GEOGRAPHY |
15 |
GEOMETRY |
GEOMETRY |
16 |
VECTOR |
VECTOR |
qmark
๋ฐ numeric
๋ฐ์ธ๋ฉ์ฉ ๋ฐ์ดํฐ ํ์
๋งคํยถ
paramstyle
์ด "qmark"
๋๋ "numeric"
์ธ ๊ฒฝ์ฐ์๋ Python์์ Snowflake ๋ฐ์ดํฐ ํ์
์ผ๋ก ๋ค์๊ณผ ๊ฐ์ ๊ธฐ๋ณธ ๋งคํ์ด ์ฌ์ฉ๋ฉ๋๋ค.
Python ๋ฐ์ดํฐ ํ์ |
Snowflake ๋ฐ์ดํฐ ํ์ |
---|---|
|
NUMBER(38, 0) |
|
NUMBER(38, 0) |
|
NUMBER(38, <์์ ์๋ฆฟ์>) |
|
REAL |
|
TEXT |
|
TEXT |
|
BINARY |
|
BINARY |
|
BOOLEAN |
|
DATE |
|
TIME |
|
TIME |
|
TIMESTAMP_NTZ |
|
TIMESTAMP_NTZ |
๋ค๋ฅธ Snowflake ํ์
์ผ๋ก ๋งคํ(์: datetime
์ TIMESTAMP_LTZ
๋ก)ํด์ผ ํ๋ ๊ฒฝ์ฐ์๋ Snowflake ๋ฐ์ดํฐ ํ์
๋ค์์ ๊ฐ์ด ์ค๋ ํ์์ผ๋ก ๊ตฌ์ฑ๋ ํํ๋ก Snowflake ๋ฐ์ดํฐ ํ์
์ ์ง์ ํฉ๋๋ค. ์๋ TIMESTAMP๋ฅผ ์ฌ์ฉํ ๋ ์ง/์๊ฐ ๋ฐ์ธ๋ฉ ์ ์ฐธ์กฐํ์ญ์์ค.
์ค๋ธ์ ํธ: Exception
ยถ
PEP-249๋ ์ค๋ฅ ๋๋ ๊ฒฝ๊ณ ๊ฐ ๋ฐ์ํ๋ ๊ฒฝ์ฐ Python์ฉ Snowflake Connector์์ ๋ฐ์ํ ์ ์๋ ์์ธ๋ฅผ ์ ์ํฉ๋๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ ์ด๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์ฒ๋ฆฌํ๊ณ ์ฝ๋ ์คํ์ ๊ณ์ ๋๋ ์ค์ง ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํฉ๋๋ค.
์์ธํ ๋ด์ฉ์ PEP-249 ์ค๋ช ์๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
๋ฉ์๋ยถ
Exception
์ค๋ธ์ ํธ์ฉ์ผ๋ก ์ฌ์ฉํ ์ ์๋ ๋ฉ์๋๋ ์์ต๋๋ค.
์์ฑยถ
- errnoยถ
Snowflake DB ์ค๋ฅ ์ฝ๋์ ๋๋ค.
- msgยถ
์ค๋ฅ ์ฝ๋, SQL ์ํ ์ฝ๋ ๋ฐ ์ฟผ๋ฆฌ ID ๋ฑ์ ์ค๋ฅ ๋ฉ์์ง์ ๋๋ค.
- raw_msgยถ
์ค๋ฅ ๋ฉ์์ง์ ๋๋ค. ์ค๋ฅ ์ฝ๋, SQL ์ํ ์ฝ๋ ๋๋ ์ฟผ๋ฆฌ ID๊ฐ ํฌํจ๋์ง ์์ต๋๋ค.
- sqlstateยถ
ANSI ๊ท๊ฒฉ SQL ์ํ ์ฝ๋์ ๋๋ค
- sfqid
Snowflake ์ฟผ๋ฆฌ ID์ ๋๋ค.
์ค๋ธ์ ํธ ResultBatch
ยถ
ResultBatch
์ค๋ธ์ ํธ๋ ๊ฒฐ๊ณผ ์ธํธ์์ ํ์ ํ์ ์ธํธ๋ฅผ ๊ฒ์ํ๋ ํจ์๋ฅผ ์บก์ํํฉ๋๋ค. ์ฌ๋ฌ ์์
์ ๋๋ ๋
ธ๋์์ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ ธ์ค๋ ์์
์ ๋ฐฐํฌ ํ๋ ค๋ฉด Cursor ์ค๋ธ์ ํธ์์ get_result_batches()
๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ResultBatch
์ค๋ธ์ ํธ์ ๋ชฉ๋ก์ ๊ฒ์ํ๊ณ ์ฒ๋ฆฌ๋ฅผ ์ํด ๋ค์ํ ์์
์ ๋๋ ๋
ธ๋์ ์ด๋ฌํ ์ค๋ธ์ ํธ๋ฅผ ๋ฐฐํฌํ ์ ์์ต๋๋ค.
์์ฑยถ
ํ ์ยถ
๊ฒฐ๊ณผ ๋ฐฐ์น์์ ํ์ ์๋ฅผ ๋ฐํํ๋ ์ฝ๊ธฐ ์ ์ฉ ์์ฑ์ ๋๋ค.
์์ถ_ํฌ๊ธฐยถ
๊ฒฐ๊ณผ ๋ฐฐ์น์์ (์์ถ ์) ๋ฐ์ดํฐ์ ํฌ๊ธฐ๋ฅผ ๋ฐํํ๋ ์ฝ๊ธฐ ์ ์ฉ ์์ฑ์ ๋๋ค.
๋น์์ถ_ํฌ๊ธฐยถ
๊ฒฐ๊ณผ ๋ฐฐ์น์์ (๋น์์ถ) ๋ฐ์ดํฐ์ ํฌ๊ธฐ๋ฅผ ๋ฐํํ๋ ์ฝ๊ธฐ ์ ์ฉ ์์ฑ์ ๋๋ค.
๋ฉ์๋ยถ
- to_arrow()ยถ
- ๋ชฉ์ :
์ด ๋ฉ์๋๋
ResultBatch
์ค๋ธ์ ํธ์ ํ์ ํฌํจํ๋ PyArrow ํ ์ด๋ธ์ ๋ฐํํฉ๋๋ค.- ๋งค๊ฐ ๋ณ์:
์์ต๋๋ค.
- ๋ฐํ:
ResultBatch
์ค๋ธ์ ํธ์์ ํ์ ํฌํจํ๋ PyArrow ํ ์ด๋ธ์ ๋ฐํํฉ๋๋ค.ํ์ด ์์ผ๋ฉด None์ด ๋ฐํ๋ฉ๋๋ค.
- to_pandas()ยถ
- ๋ชฉ์ :
์ด ๋ฉ์๋๋
ResultBatch
์ค๋ธ์ ํธ์ ํ์ ํฌํจํ๋ pandas DataFrame์ ๋ฐํํฉ๋๋ค.- ๋งค๊ฐ ๋ณ์:
์์ต๋๋ค.
- ๋ฐํ:
ResultBatch
์ค๋ธ์ ํธ์์ ํ์ ํฌํจํ๋ pandas DataFrame์ ๋ฐํํฉ๋๋ค.ํ์ด ์์ผ๋ฉด ๋น pandas DataFrame์ ๋ฐํํฉ๋๋ค.
์ค๋ธ์ ํธ: ResultMetadata
ยถ
ResultMetadata
์ค๋ธ์ ํธ๋ ๊ฒฐ๊ณผ ์ธํธ ๋ด์ ์ด์ ๋ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋ํ๋
๋๋ค. ์ด๋ฌํ ์ค๋ธ์ ํธ์ ๋ชฉ๋ก์ Cursor
์ค๋ธ์ ํธ์ description
์์ฑ ๋ฐ describe
๋ฉ์๋์ ์ํด ๋ฐํ๋ฉ๋๋ค.
์ด ์ค๋ธ์ ํธ๋ Python์ฉ Snowflake ์ปค๋ฅํฐ์ 2.4.6 ๋ฒ์ ์์ ๋์ ๋์์ต๋๋ค.
๋ฉ์๋ยถ
์์ต๋๋ค.
์์ฑยถ
- nameยถ
์ด์ ์ด๋ฆ
- type_codeยถ
๋ด๋ถ ํ์ ์ฝ๋.
- display_sizeยถ
์ฌ์ฉ๋์ง ์์ต๋๋ค. ๋ด๋ถ_ํฌ๊ธฐ์ ๋์ผํฉ๋๋ค.
- internal_sizeยถ
๋ด๋ถ ๋ฐ์ดํฐ ํฌ๊ธฐ.
- precisionยถ
์ซ์ ๋ฐ์ดํฐ์ ์ ์ฒด ์๋ฆฟ์.
- scaleยถ
์ซ์ ๋ฐ์ดํฐ์ ์์ ์๋ฆฟ์์ ๋๋ค.
- is_nullableยถ
์ด ๋๋
False
์์ NULL ๊ฐ์ด ํ์ฉ๋๋ ๊ฒฝ์ฐTrue
.
๋ชจ๋: snowflake.connector.constants
ยถ
snowflake.connector.constants
๋ชจ๋์ API์์ ์ฌ์ฉ๋๋ ์์๋ฅผ ์ ์ํฉ๋๋ค.
์ด๊ฑฐํยถ
- class QueryStatusยถ
๋น๋๊ธฐ ์ฟผ๋ฆฌ์ ์ํ๋ฅผ ๋ํ๋ ๋๋ค. ์ด ์ด๊ฑฐํ์ ํฌํจ๋๋ ์์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์ด๊ฑฐํ ์์
์ค๋ช
RUNNING
์ฟผ๋ฆฌ๋ฅผ ์์ง ์คํํ๋ ์ค์ ๋๋ค.
ABORTING
์๋ฒ ์ธก์์ ์ฟผ๋ฆฌ๋ฅผ ์ค๋จํ๋ ์ค์ ๋๋ค.
SUCCESS
์ฟผ๋ฆฌ๊ฐ ์ฑ๊ณต์ ์ผ๋ก ์ข ๋ฃ๋์์ต๋๋ค.
FAILED_WITH_ERROR
์ฟผ๋ฆฌ๊ฐ ์ข ๋ฃ๋์์ง๋ง ์คํจํ์ต๋๋ค.
QUEUED
์คํ์ ์ํด ์ฟผ๋ฆฌ๊ฐ ํ์์ ๋๊ธฐ ์ค์ด๋ฉฐ(์ฆ, ์์ง ์คํ์ด ์์๋์ง ์์), ์ด๋ฌํ ์ผ๋ฐ์ ์ธ ์ด์ ๋ ๋ฆฌ์์ค๋ฅผ ๋๊ธฐ ์ค์ด๊ธฐ ๋๋ฌธ์ ๋๋ค.
DISCONNECTED
์ธ์ ์ ์ฐ๊ฒฐ์ด ๋๊ฒผ์ต๋๋ค. ์ฟผ๋ฆฌ์ ์ํ๊ฐ ๊ณง โFAILED_WITH_ERRORโ๋ก ๋ณ๊ฒฝ๋ฉ๋๋ค.
RESUMING_WAREHOUSE
์จ์ดํ์ฐ์ค๊ฐ ์์๋์์ง๋ง ์์ง ์ฟผ๋ฆฌ๊ฐ ์คํ ์ค์ด ์๋๋๋ค.
BLOCKED
๋ฌธ์ด ๋ค๋ฅธ ๋ฌธ์ด ์ ๊ทผ ๋ฆฌ์์ค๋ฅผ ๋๊ธฐํ๊ณ ์์ต๋๋ค.
NO_DATA
๋ฌธ์ ๋ํ ๋ฐ์ดํฐ๋ฅผ ์์ง ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด๋ฌํ ์ผ๋ฐ์ ์ธ ์ด์ ๋ ๋ฌธ์ ์คํ์ด ์์ง ์์๋์ง ์์๊ธฐ ๋๋ฌธ์ ๋๋ค.
๋ชจ๋: snowflake.connector.pandas_tools
ยถ
snowflake.connector.pandas_tools
๋ชจ๋์ pandas ๋ฐ์ดํฐ ๋ถ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํจ๊ป ๋์ํ๊ธฐ ์ํ ํจ์๋ฅผ ์ ๊ณตํฉ๋๋ค.
์์ธํ ๋ด์ฉ์ pandas ๋ฐ์ดํฐ ๋ถ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค๋ช ์๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
ํจ์ยถ
- write_pandas(parameters...)ยถ
- ๋ชฉ์ :
pandas DataFrame์ Snowflake ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํ ์ด๋ธ์ ์์ฑํฉ๋๋ค.
๋ฐ์ดํฐ๋ฅผ ํ ์ด๋ธ์ ์์ฑํ๋ ค๋ฉด, ์ด ํจ์๋ ๋ฐ์ดํฐ๋ฅผ Parquet ํ์ผ์ ์ ์ฅํ๊ณ PUT ๋ช ๋ น์ ์ฌ์ฉํ์ฌ ์ด๋ฌํ ํ์ผ์ ์์ ์คํ ์ด์ง์ ์ ๋ก๋ํ๋ฉฐ COPY INTO <ํ ์ด๋ธ> ๋ช ๋ น์ ์ฌ์ฉํ์ฌ ํ์ผ์์ ํ ์ด๋ธ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ณต์ฌํฉ๋๋ค. ์ผ๋ถ ํจ์ ๋งค๊ฐ ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ
PUT
๋ฐCOPY INTO <ํ ์ด๋ธ >
๋ฌธ์ ์คํ ๋ฐฉ๋ฒ์ ์ ์ดํ ์ ์์ต๋๋ค.- ๋งค๊ฐ ๋ณ์:
์ ํจํ ์ ๋ ฅ ๋งค๊ฐ ๋ณ์:
๋งค๊ฐ ๋ณ์
ํ์
์ค๋ช
conn
์
Snowflake ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก์ ์ฐ๊ฒฐ์ ์ ์งํ๋
Connection
์ค๋ธ์ ํธ์ ๋๋ค.df
์
ํ ์ด๋ธ๋ก ๋ณต์ฌ๋ ๋ฐ์ดํฐ๊ฐ ํฌํจ๋
pandas.DataFrame
์ค๋ธ์ ํธ์ ๋๋ค.table_name
์
๋ฐ์ดํฐ๋ฅผ ๋ณต์ฌํ ํ ์ด๋ธ์ ์ด๋ฆ์ ๋๋ค.
database
ํ ์ด๋ธ์ด ํฌํจ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ด๋ฆ์ ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ์ด ํจ์๋ ํ์ฌ ์ธ์ ์์ ์ฌ์ฉ ์ค์ธ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์์ฑํฉ๋๋ค. ์ฐธ๊ณ : ์ด ๋งค๊ฐ ๋ณ์๋ฅผ ์ง์ ํ๋ฉด
schema
๋งค๊ฐ ๋ณ์๋ ์ง์ ํด์ผ ํฉ๋๋ค.schema
ํ ์ด๋ธ์ด ํฌํจ๋ ์คํค๋ง์ ์ด๋ฆ์ ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ์ด ํจ์๋ ํ์ฌ ์ธ์ ์์ ์ฌ์ฉ ์ค์ธ ์คํค๋ง์ ํ ์ด๋ธ์ ์์ฑํฉ๋๋ค.
chunk_size
ํ ๋ฒ์ ์ฝ์ ํ ์์์ ์ด๋ฆ์ ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ์ด ํจ์๋ 1๊ฐ ์ฒญํฌ์ ํ ๋ฒ์ ๋ชจ๋ ์์๋ฅผ ์ฝ์ ํฉ๋๋ค.
compression
Parquet ํ์ผ์์ ์ฌ์ฉํ ์์ถ ์๊ณ ๋ฆฌ์ฆ์ ๋๋ค. ์์ถ์ ํฅ์ํ๊ธฐ ์ํด
"gzip"
์ ์ง์ ํ๊ฑฐ๋ ๋น ๋ฅธ ์์ถ์ ์ํด"snappy"
๋ฅผ ์ง์ ํ ์ ์์ต๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก, ์ด ํจ์์์๋"gzip"
์ ์ฌ์ฉํฉ๋๋ค.on_error
์ค๋ฅ๊ฐ ์ฒ๋ฆฌ๋๋ ๋ฐฉ๋ฒ์ ์ง์ ํฉ๋๋ค.
ON_ERROR
๋ณต์ฌ ์ต์ ์ ์ค๋ช ๋ ๋ฌธ์์ด ๊ฐ ์ค 1๊ฐ๋ก ์ด ๊ฐ์ ์ค์ ํฉ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก, ์ด ํจ์์์๋"ABORT_STATEMENT"
๋ฅผ ์ฌ์ฉํฉ๋๋ค.parallel
Parquet ํ์ผ์ ์์ ์คํ ์ด์ง๋ก ์ ๋ก๋ํ ๋ ์ฌ์ฉํ ์ค๋ ๋์ ๊ฐ์์ ๋๋ค. ์ฌ์ฉ๋๋ ์ค๋ ๋์ ๊ธฐ๋ณธ ๊ฐ์์ ์ค๋ ๋ ๊ฐ์๋ฅผ ์ ํํ ๋์ ์ง์นจ์ PUT ๋ช ๋ น์ ๋ณ๋ ฌ ๋งค๊ฐ ๋ณ์ ๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
quote_identifiers
False
์ธ ๊ฒฝ์ฐ, ์ปค๋ฅํฐ๋ ์๋ณ์๋ฅผ ํฐ๋ฐ์ดํ๋ก ๋ฌถ์ง ์๊ณ ์๋ณ์๋ฅผ ์๋ฒ๋ก ์ ์กํฉ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ์ปค๋ฅํฐ๋ ์๋ณ์๋ฅผ ํฐ๋ฐ์ดํ๋ก ๋ฌถ์ต๋๋ค.- ๋ฐํ:
(success, num_chunks, num_rows, output)
์ ํํ์ ๋ฐํํฉ๋๋ค. ์ฌ๊ธฐ์,ํจ์์์ ๋ฐ์ดํฐ๋ฅผ ํ ์ด๋ธ์ ์์ฑํ๋ ๋ฐ ์ฑ๊ณตํ๋ฉด
success
์True
์ ๋๋ค.num_chunks
๋ ํจ์์์ ๋ณต์ฌํ ๋ฐ์ดํฐ ์ฒญํฌ์ ์์ ๋๋ค.num_rows
๋ ํจ์์์ ์ฝ์ ํ ํ์ ์์ ๋๋ค.output
์COPY INTO <ํ ์ด๋ธ>
๋ช ๋ น์ ์ถ๋ ฅ์ ๋๋ค.
- ์:
๋ค์ ์์์๋ pandas DataFrame์์ โ๊ณ ๊ฐโ ํ ์ด๋ธ๋ก ๋ฐ์ดํฐ๋ฅผ ์์ฑํฉ๋๋ค.
import pandas from snowflake.connector.pandas_tools import write_pandas # Create the connection to the Snowflake database. cnx = snowflake.connector.connect(...) # Create a DataFrame containing data about customers df = pandas.DataFrame([('Mark', 10), ('Luke', 20)], columns=['name', 'balance']) # Write the data from the DataFrame to the table named "customers". success, nchunks, nrows, _ = write_pandas(cnx, df, 'customers')
- pd_writer(parameters...)ยถ
- ๋ชฉ์ :
pd_writer
๋ ๋ฐ์ดํฐ๋ฅผ Snowflake ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก ์ฝ์ ํ๊ธฐ ์ํ insertion ๋ฉ์๋์ ๋๋ค.pandas.DataFrame.to_sql
์ ํธ์ถํ ๋,method=pd_writer
๋ฅผ ์ ๋ฌํ์ฌpd_writer
๋ฅผ ๋ฐ์ดํฐ ์ฝ์ ๋ฐฉ๋ฒ์ผ๋ก ์ฌ์ฉํ๋๋ก ์ง์ ํฉ๋๋ค. (์ฝ๋์์pd_writer
๋ฅผ ํธ์ถํ ํ์๊ฐ ์์ต๋๋ค.to_sql
๋ฉ์๋๋pd_writer
๋ฅผ ํธ์ถํ๋ฉฐ ํ์ํ ์ ๋ ฅ ๋งค๊ฐ ๋ณ์๋ฅผ ์ ๊ณตํฉ๋๋ค.)์์ธํ ๋ด์ฉ์ ๋ค์์ ์ฐธ์กฐํ์ญ์์ค.
์ฝ์ ๋ฉ์๋ ์ค๋ช ์.
pandas ์ค๋ช ์.
์ฐธ๊ณ
pandas
DataFrame
์ ์ด ์ด๋ฆ์ ์๋ฌธ์๋ง ํฌํจ๋ ๊ฒฝ์ฐ ์ด ์ด๋ฆ์ ํฐ๋ฐ์ดํ๋ก ๋ฌถ์ด์ผ ํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์ปค๋ฅํฐ๊ฐProgrammingError
๋ฅผ ๋ฐ์์ํต๋๋ค.snowflake-sqlalchemy
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ํ ์ด๋ธ์ ์์ฑํ ๋ ์๋ฌธ์ ์ด ์ด๋ฆ์ ๋ฐ์ดํ๋ก ๋ฌถ์ง ์๋ ๋ฐ๋ฉด,pd_writer
๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ด ์ด๋ฆ์ ๋ฐ์ดํ๋ก ๋ฌถ์ต๋๋ค. COPY INTO ๋ช ๋ น์์ ์ด ์ด๋ฆ์ด ๋น์ฐํ ๋ฐ์ดํ๋ก ๋ฌถ์ผ ๊ฒ์ผ๋ก ์์ํ๊ธฐ ๋๋ฌธ์ ์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค.ํฅํ ๊ฐ์ ์ฌํญ์
snowflake-sqlalchemy
๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ ๊ณตํ ์์ ์ ๋๋ค.์:
import pandas as pd from snowflake.connector.pandas_tools import pd_writer sf_connector_version_df = pd.DataFrame([('snowflake-connector-python', '1.0')], columns=['NAME', 'NEWEST_VERSION']) # Specify that the to_sql method should use the pd_writer function # to write the data from the DataFrame to the table named "driver_versions" # in the Snowflake database. sf_connector_version_df.to_sql('driver_versions', engine, index=False, method=pd_writer) # When the column names consist of only lower case letters, quote the column names sf_connector_version_df = pd.DataFrame([('snowflake-connector-python', '1.0')], columns=['"name"', '"newest_version"']) sf_connector_version_df.to_sql('driver_versions', engine, index=False, method=pd_writer)
pd_writer
ํจ์์์๋write_pandas()
ํจ์๋ฅผ ์ฌ์ฉํ์ฌ DataFrame์ ๋ฐ์ดํฐ๋ฅผ Snowflake ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก ์์ฑํฉ๋๋ค.- ๋งค๊ฐ ๋ณ์:
์ ํจํ ์ ๋ ฅ ๋งค๊ฐ ๋ณ์:
๋งค๊ฐ ๋ณ์
ํ์
์ค๋ช
table
์
ํ ์ด๋ธ์ ์ํ
pandas.io.sql.SQLTable
์ค๋ธ์ ํธ์ ๋๋ค.conn
์
Snowflake ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก ์ฐ๊ฒฐํ๊ธฐ ์ํด ์ฌ์ฉ๋
sqlalchemy.engine.Engine
๋๋sqlalchemy.engine.Connection
์ค๋ธ์ ํธ์ ๋๋ค.keys
์
์ฝ์ ํ ๋ฐ์ดํฐ์ ๋ํ ํ ์ด๋ธ ์ด์ ์ด๋ฆ์ ๋๋ค.
data_iter
์
์ฝ์ ํ ๋ฐ์ดํฐ๊ฐ ํฌํจ๋ ํ์ ๋ฐ๋ณต๊ธฐ์ ๋๋ค.
- ์:
๋ค์ ์์์๋
method=pd_writer
๋ฅผpandas.DataFrame.to_sql
๋ฉ์๋๋ก ์ ๋ฌํ๊ณ , ์ด ๋ฉ์๋๋pd_writer
ํจ์๋ฅผ ํธ์ถํ์ฌ pandas DataFrame์ ๋ฐ์ดํฐ๋ฅผ Snowflake ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์์ฑํฉ๋๋ค.import pandas from snowflake.connector.pandas_tools import pd_writer # Create a DataFrame containing data about customers df = pandas.DataFrame([('Mark', 10), ('Luke', 20)], columns=['name', 'balance']) # Specify that the to_sql method should use the pd_writer function # to write the data from the DataFrame to the table named "customers" # in the Snowflake database. df.to_sql('customers', engine, index=False, method=pd_writer)
๋ ์ง ๋ฐ ํ์์คํฌํ ์ง์ยถ
Snowflake๋ ์ฌ๋ฌ DATE ๋ฐ TIMESTAMP ๋ฐ์ดํฐ ํ์
์ ์ง์ํ๋ฉฐ, Snowflake ์ปค๋ฅํฐ๋ ์
๋ฐ์ดํธ ๋ฐ ํ์น ์์
์ ์ํด ๋ค์ดํฐ๋ธ datetime
๋ฐ date
์ค๋ธ์ ํธ๋ฅผ ๋ฐ์ธ๋ฉํ ์ ์์ต๋๋ค.
๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐยถ
๋ ์ง ๋ฐ ์๊ฐ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ฌ ๋ Snowflake ๋ฐ์ดํฐ ํ์ ์ด Python ๋ฐ์ดํฐ ํ์ ์ผ๋ก ๋ณํ๋ฉ๋๋ค.
Snowflake ๋ฐ์ดํฐ ํ์ |
Python ๋ฐ์ดํฐ ํ์ |
๋์ |
---|---|---|
TIMESTAMP_TZ |
tzinfo ํฌํจ ๋ ์ง/์๊ฐ |
ํ์์กด ์คํ์
๋ฑ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ณ |
TIMESTAMP_LTZ, TIMESTAMP |
tzinfo ํฌํจ ๋ ์ง/์๊ฐ |
๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ณ |
TIMESTAMP_NTZ |
๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ณ |
|
DATE |
๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ณ |
์ฐธ๊ณ
tzinfo
๋ UTC ์คํ์
๊ธฐ๋ฐ ํ์์กด ์ค๋ธ์ ํธ์ด๋ฉฐ IANA ํ์์กด ์ด๋ฆ์ด ์๋๋๋ค. ํ์์กด ์ด๋ฆ์ ์ผ์นํ์ง ์์ ์ ์์ง๋ง, ๋๋ฑํ ์คํ์
๊ธฐ๋ฐ ํ์์กด ์ค๋ธ์ ํธ๋ ๋์ผํ ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋ฉ๋๋ค.
๋ฐ์ดํฐ ์ ๋ฐ์ดํธํ๊ธฐยถ
๋ ์ง ๋ฐ ์๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฐ์ดํธํ ๋ Python ๋ฐ์ดํฐ ํ์ ์ด Snowflake ๋ฐ์ดํฐ ํ์ ์ผ๋ก ๋ณํ๋ฉ๋๋ค.
Python ๋ฐ์ดํฐ ํ์ |
Snowflake ๋ฐ์ดํฐ ํ์ |
๋์ |
---|---|---|
๋ ์ง/์๊ฐ |
TIMESTAMP_TZ, TIMESTAMP_LTZ, TIMESTAMP_NTZ, DATE |
๋ ์ง/์๊ฐ ์ค๋ธ์ ํธ๋ฅผ |
struct_time |
TIMESTAMP_TZ, TIMESTAMP_LTZ, TIMESTAMP_NTZ, DATE |
struct_time ์ค๋ธ์ ํธ๋ฅผ |
๋ ์ง |
TIMESTAMP_TZ, TIMESTAMP_LTZ, TIMESTAMP_NTZ, DATE |
๋ ์ง ์ค๋ธ์ ํธ๋ฅผ |
์๊ฐ |
TIMESTAMP_TZ, TIMESTAMP_LTZ, TIMESTAMP_NTZ, DATE |
์๊ฐ ์ค๋ธ์ ํธ๋ฅผ |
timedelta |
TIMESTAMP_TZ, TIMESTAMP_LTZ, TIMESTAMP_NTZ, DATE |
timedelta ์ค๋ธ์ ํธ๋ฅผ |