はじめに
dbtからBigQueryへの接続テストを行う際、dbt debug を実行すると以下のエラーが発生することがあります。
'NoneType' object has no attribute 'close'
このエラーは、接続処理の途中で何らかの理由により「接続オブジェクト」が生成されず(Noneになり)、その中身がない状態で接続を終了しようとした際に発生するものです。
今回は、このエラーを解消するための4つのステップを紹介します。
解決手順
1. 環境変数のリセット
意図しない認証情報が干渉している可能性があるため、一度環境変数をクリアします。特に GOOGLE_APPLICATION_CREDENTIALS が古いパスを指していると、profiles.yml の設定より優先されてしまい、エラーの原因となります。
unset GOOGLE_APPLICATION_CREDENTIALS
2. 依存関係の強制的な再インストール
dbt本体とBigQuery用アダプター、およびGoogle Cloud SDKのライブラリ間でバージョンの不整合(競合)が起きているケースがあります。これらを一括で最新版に更新することで解決することが多いです。
pip install --upgrade dbt-bigquery google-cloud-bigquery
3. dbtのキャッシュクリア
過去の実行時に作成された一時ファイルやコンパイル済みのキャッシュが影響を及ぼしている可能性があります。一度クリーンな状態に戻します。
dbt clean
4. 再度接続テストを実行
準備が整ったら、再度接続を確認します。
dbt debug
結果
上記の手順を踏むことで、無事に以下のようなメッセージが表示されるはずです。
Connection test: [OK connection ok] All checks passed!
まとめ
'NoneType' object has no attribute 'close' は、一見コードのバグのように見えますが、実態は「認証情報の優先順位の混乱」や「ライブラリのバージョン不整合」がほとんどです。
もし dbt debug で同様のエラーに遭遇した場合は、まず環境変数の掃除とライブラリのアップデートを試してみてください!


