PostgreSQL
データベース管理システム チュートリアル: tutorial
install
brew install postgresql
確認
postgres
これでサーバーが起動する(jupyterと同じ). もし以下のように怒られたら
postgres does not know where to find the server configuration file.
You must specify the --config-file or -D invocation option or set the PGDATA environment variable.
.zshrcに
export PGDATA=/usr/local/var/postgres
を追加する.
Unique index
SELECT * FROM pg_indexes
reference
https://github.com/Homebrew/legacy-homebrew/issues/21920 https://qiita.com/gooddoog/items/1f986c1a6c0f253bd4e2
データベースにアクセス
psql mydbname
でデータベースにアクセスし, 対話型で起動する.
psql -l
でデータベースの一覧が確認できる.
pythonやjuliaからremoteの(postgres)sql queryを叩く方法
pythonならpsycopg2 or sqlalchemy, juliaならLibPQを使う. pythonはsqlalchemyがおすすめ. 具体例はpython, juliaを参照. 以下はやや特殊な場合なので必要なら見る.
ssh tunnelを使う場合
import psycopg2
import pandas as pd
import time
from sshtunnel import SSHTunnelForwarder
def queryAurora(sql):
with SSHTunnelForwarder(
"ssh_name",
="~/.ssh/id_rsa",
ssh_pkey=("hogehoge", 5432)
remote_bind_addressas server:
) = psycopg2.connect(
conn ='localhost',
host=server.local_bind_port,
port='hogedb',
dbname='foo',
user='bar')
password= conn.cursor()
cur
cur.execute(sql)= cur.fetchall()
result = [col.name for col in cur.description]
colnames # pandas.DataFrameで返す用の処理
= [[one for one in one_result] for one_result in result]
new_result = pd.DataFrame(new_result,columns=colnames)
result
cur.close()
conn.close()# 連続で叩くと凄くヤバいので1秒待つ
1)
time.sleep(return resul
port forwarding
using LibPQ
function sql(query)
= LibPQ.Connection("dbname='hogedb' host='localhost' user='foo' password='bar' port=45432")
conn =execute(conn,query)
result = DataFrame(result)
df close(conn)
sleep(1)
return df
end
ipython magic command with port forwarding (only python)
pgconfig = {
'host': 'localhost',
'port': 45432,
'database': 'hoge',
'user': 'foo',
'password': 'bar',
}
%load_ext sql
dsl = 'postgres://{user}:{password}@{host}:{port}/{database}'.format(**pgconfig)
%sql $dsl
%%sql
select *
from companies c
where name~'Apple'
変数化したいときは以下のようにやる.
hogehoge = 'Apple'
%%sql
select *
from companies c
where name~hogehoge
チラシの裏
COALESCE関数はnullを別の値に置き換える関数
RDBは負荷がかかりすぎると当然おちる
GlueはDBが落ちて接続が切れるとunknownReasonでerrorを返すと推察される
numPartitionsはテーブルの読み書きの平行数とJDBC接続の最大数を設定する(http://mogile.web.fc2.com/spark/sql-data-sources-jdbc.html)
Aurora postgresは標準でかなりのconnectionを許す(https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/AuroraPostgreSQL.Managing.html )が負荷がかかり過ぎれば当然落ちる
Aurora(一般にRDB)には大量にくるクエリをqueueのようにさばく機能はない.
auto scaling機能は今回のようなケースの解決策として適さない。なぜなら負荷のスピードとスケーリングの速度がマッチしない。普通はユーザーの数のようにゆっくり増えるようなスケーリングに対して有効な機能である。
'select * from pgstatactivity'でprosessが確認できる
auroraには集計関数arrayaggが存在するがredshiftにはない.
bigqueryはtimezoneがUSのみ