Python, RでDBに接続するときのパスワードをコードに直打ちしない
Python, RともにDBに接続するときにパスワード情報をソースに直打ちすると、gitなどにアップするときに色々とヤバいので直打ちしない方法をメモ。
json設定ファイルから
以下のようなpassword管理用のjsonファイルを作る。
{ "redshift": { "id": "myID", "pw": "myPassword" }, "bigquery": { "id": "myID", "pw": "myPassword" } }
Python
以下のコードでjsonから欲しい情報を変数に格納する。
import pandas as pd import psycopg2 as psy2 import json with open('~/settings/pass.json') as f: password = json.load(f)['redshift']['pw']
この変数password
を使って接続情報を作る。
def get_connection_db(user, password): ''' Examples: >>> con = get_connection_db('user_name', password) >>> df = pd.read_sql('SELECT * from hoge.fuga limit 10', con) ''' return psy2.connect( host = 'localhost', password = password, user = user, port = 5439, database = 'db_name' ) con = get_connection_db('user_name', password)
R
Python同様に、jsomファイルを読み込んで変数として渡す。
library(tidyverse) library(jsonlite) library(RPostgres) library(dbplyr) pass_json = jsonlite::fromJSON("~/settings/pass.json") # json読み込み pass = pass_json$redshift$pw # redshift内のpw部分を読み込み con = dbConnect( RPostgres::Postgres(), dbname= "db_name", host = "localhost", port = 5439, user = "user_name", password = pass # jsonから読み込んだpasswordを渡す ) # hoge.fugaテーブルへのアクセス tb= dplyr::tbl(con, dbplyr::iin_schema("hoge", "fuga"))
環境変数から
bash_profile
かなんかに以下を追記(名前とか変数名テキトー)。
export REDSHIFT_USERNAME=username export REDSHIFT_PASSWORD=password
Python
os.environ
で環境変数を取得できるので取得。
import psycopg2 as db import os # 接続設定 def connect2redshift(): con = db.connect( host='localhost', port=5439, user=os.environ['REDSHIFT_USERNAME'], password=os.environ['REDSHIFT_PASSWORD'], dbname='db_name' ) return con query = 'SELECT * FROM hoge.fuga limit 1' with connect2redshift() as con: df = pd.read_sql(query, con)
R
同様に、Sys.getenv()
で環境変数を取得できるっぽい。ただし、試してみたら自分の場合は環境変数一覧をnames(Sys.getenv())
で確認しても何故か追記分の環境変数が出てこなかったのでなんか違うかも(未検証)
library(tidyverse) library(RPostgres) library(dbplyr) con = dbConnect( RPostgres::Postgres(), dbname= "db_name", host = "localhost", port = 5439, user = Sys.getenv("REDSHIFT_USERNAME"), password = Sys.getenv("REDSHIFT_PASSWORD") )
あとは通常通りこのcon
を用いてDBにアクセス
# hoge.fugaテーブルへのアクセス tb= dplyr::tbl(con, dbplyr::iin_schema("hoge", "fuga"))
Rstudio(Rのみ)
また、Rstudioを使っている場合、connect情報のpassword部分に対してrstudioapi::askForPassword
でpasswordを打ち込むとポップアップが出るのでこれを利用することも可能。
library(tidyverse) library(RPostgres) library(dbplyr) con = dbConnect( RPostgres::Postgres(), dbname= "db_name", host = "localhost", port = 5439, user = "user_name", password = rstudioapi::askForPassword("password") # ポップアップ出現 ) # hoge.fugaテーブルへのアクセス tb= dplyr::tbl(con, dbplyr::iin_schema("hoge", "fuga"))