공식 클라이언트는 trino 패키지다. 예전 이름인 presto-python-client 는 쓰지 않는다.
pip install "trino[sqlalchemy]"
SQLAlchemy 연동이 필요 없으면 pip install trino 만으로 충분하다.
import trino
conn = trino.dbapi.connect(
host="trino-coordinator",
port=8080,
user="analyst",
catalog="hive",
schema="default",
http_scheme="http",
)
cur = conn.cursor()
cur.execute("SELECT id, name FROM users LIMIT 10")
for row in cur.fetchall():
print(row)
conn.close()
인증을 켜지 않은 Trino 는 user 값을 검증 없이 신뢰한다. 이 값이 그대로 접근 제어와 쿼리 이력에 기록되므로 실제 사용자 이름을 넣는다.
비밀번호 기반 인증(LDAP · 파일 기반)은 HTTPS 에서만 허용된다. HTTP 로 보내면 coordinator 가 거부한다.
import os
import trino
from trino.auth import BasicAuthentication
conn = trino.dbapi.connect(
host="trino-coordinator",
port=8443,
user=os.environ["TRINO_USER"],
catalog="hive",
schema="default",
http_scheme="https",
auth=BasicAuthentication(os.environ["TRINO_USER"], os.environ["TRINO_PASSWORD"]),
)
자격 증명은 코드에 적지 않고 환경 변수나 별도 파일에서 읽는다.
사설 CA 가 발급한 인증서를 쓰면 CA 인증서 경로를 verify 에 준다.
conn = trino.dbapi.connect(
host="trino-coordinator",
port=8443,
user=os.environ["TRINO_USER"],
http_scheme="https",
auth=BasicAuthentication(os.environ["TRINO_USER"], os.environ["TRINO_PASSWORD"]),
verify="/etc/pki/ca-trust/source/anchors/internal-ca.crt",
)
verify=False 로 검증을 끄는 방법도 있지만, 그 순간 중간자 공격을 막을 수단이 사라진다. 임시 확인 용도로만 쓰고 운영 코드에 남기지 않는다. 검증을 끄면 urllib3 경고가 계속 출력되는데, 경고를 억제하는 것으로 해결했다고 보면 안 된다.
conn = trino.dbapi.connect(
host="trino-coordinator",
port=8443,
user="analyst",
http_scheme="https",
session_properties={"query_max_run_time": "30m", "join_distribution_type": "BROADCAST"},
)
Trino 의 DBAPI 커서는 기본적으로 자동 커밋 상태로 동작한다. 여러 문장을 한 트랜잭션으로 묶으려면 isolation_level 을 지정해 연결을 만든다.
fetchall() 은 전체 결과를 메모리에 올린다. 큰 결과는 나눠 받는다.
cur.execute("SELECT * FROM big_table")
while True:
rows = cur.fetchmany(10000)
if not rows:
break
handle(rows)
close() 를 반드시 호출한다.pandas.read_sql 로 붙일 때는 SQLAlchemy 방언(trino://)을 쓴다.