まずは蝋の翼から。

学んだことを書きながら確認・整理するためのメモブログ。こういうことなのかな?といったことをふわっと書いたりしていますが、理解が浅いゆえに的はずれなことも多々あると思うのでツッコミ歓迎

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"))

f:id:chito_ng:20200430002220p:plain