PythonにてAPIより取得した辞書データをPostgreSQLのテーブルに追加したい
解決済
回答 1
投稿
- 評価
- クリップ 0
- VIEW 1,736
プログラミング初心者です。
APIより取得したデータ(辞書)を、あらかじめ作成したPostgreSQLのテーブルに追加するコードを書きたいのですが、うまくいきません。
以下はPostgreSQLにて作成したテーブルです。(APIより取得するデータの型に合わせて作りました)
mydb=> \d bitflyer
テーブル "public.bitflyer"
列 | 型 | 修飾語
-------------------+------------------+----------
best_ask_size | double precision |
total_bid_depth | double precision |
product_code | character(10) |
ltp | double precision |
best_bid_size | double precision |
volume | double precision |
tick_id | integer |
volume_by_product | double precision |
total_ask_depth | double precision |
best_ask | double precision |
timestamp | character(30) | not null
best_bid | double precision |
インデックス:
"bitflyer_key" PRIMARY KEY, btree ("timestamp")
APIより取得したデータが以下です。変数aの中に辞書データが入っています。
P=Public()
a=P.getticker()
print(a)
{'tick_id': 5643789, 'total_ask_depth': 1096.03971997, 'volume': 122179.34443855, 'product_code': 'BTC_JPY', 'best_bid_size': 0.81, 'total_bid_depth': 4499.00718145, 'volume_by_product': 12897.70069179, 'ltp': 528428.0, 'best_bid': 528290.0, 'best_ask': 528428.0, 'best_ask_size': 0.14722663, 'timestamp': '2017-09-01T09:53:57.133'}
PostgreSQLとの接続にはpsycopg2を使用しています。
#PostgreSQLに接続
import psycopg2
connection = psycopg2.connect("host=localhost port=5432 dbname=mydb user=username password=psw")
cur = connection.cursor()
データ取得時、毎回、辞書データ内要素の順番がずれるため、辞書のキーを引数として渡したいと思っています。
ここでエラーが発生してしまいます。
#キーbest_ask_sizeを引数として渡す
cur.execute("insert into bitflyer values(best_ask_size)")
--------------------------------------------------
ProgrammingError Traceback (most recent call last)
<ipython-input-7-3d83a90cb076> in <module>()
----> 1 cur.execute("insert into bitflyer values(best_ask_size)")
ProgrammingError: 列"best_ask_size"は存在しません
LINE 1: insert into bitflyer values(best_ask_size)
^
クォーテーションで囲みましたが、解決しませんでした。
#best_ask_sizeを''で囲む
cur.execute("insert into bitflyer values('best_ask_size')")
--------------------------------------------------
DataError Traceback (most recent call last)
<ipython-input-5-96258e9511e8> in <module>()
----> 1 cur.execute("insert into bitflyer values('best_ask_size')")
DataError: 型double precisionの入力構文が無効です: "best_ask_size"
LINE 1: insert into bitflyer values('best_ask_size')
^
また、辞書から変数へ以下のように代入し、入力してみたのですがダメでした。
best_ask_size = a['best_ask_size']
#クォーテーションなし
cur.execute("insert into bitflyer values(best_ask_size)")
--------------------------------------------------
ProgrammingError Traceback (most recent call last)
<ipython-input-8-3d83a90cb076> in <module>()
----> 1 cur.execute("insert into bitflyer values(best_ask_size)")
ProgrammingError: 列"best_ask_size"は存在しません
LINE 1: insert into bitflyer values(best_ask_size)
^
#クォーテーションあり
cur.execute("insert into bitflyer values('best_ask_size')")
--------------------------------------------------
DataError Traceback (most recent call last)
<ipython-input-6-96258e9511e8> in <module>()
----> 1 cur.execute("insert into bitflyer values('best_ask_size')")
DataError: 型double precisionの入力構文が無効です: "best_ask_size"
LINE 1: insert into bitflyer values('best_ask_size')
^
辞書キーとテーブルのカラムを対応させ、値を入力したいです。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
0
単純にSQLの構文が誤っています。
INSERT INTO bitflyer (best_ask_size, total_bid_depth, product_code) VALUES (0.14722663, 4499.00718145, 'BTC_JPY');
というようにカラム名を宣言したあとに、VALUESでそのカラムに対応する値を入れます。
(ちなみに全カラムをテーブル定義の順番通りにINSERTする場合に限りカラム名を省略することもできますが、順番を間違えたり、テーブルの定義を変更したときにプログラムが動かなくなってしまうなどバグの温床になりやすいのでおすすめしません)
これを psycopg2 で実行するにはこんな感じになります:
cur.execute(
'INSERT INTO bitflyer (best_ask_size, total_bid_depth, product_code) VALUES (%s, %s, %s);',
(0.14722663, 4499.00718145, 'BTC_JPY')
)
実際にAPIから取得した結果を使う場合はこうですね:
cur.execute(
'INSERT INTO bitflyer (best_ask_size, total_bid_depth, product_code) VALUES (%s, %s, %s);',
(a['best_ask_size'], a['total_bid_depth'], a['product_code'])
)
もし「そんないちいちカラム名を指定してINSERTするのは面倒なので、辞書のキー名を使っていい感じにやってくれよ」という願望があるのであれば、ORマッパーやSQLビルダーといったライブラリの導入を検討してみて下さい。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.33%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2017/09/02 19:10
記述のとおり構文を修正し、解決いたしました。
今後、余裕が生まれたら、ご紹介いただいたライブラリ周りも調べてみようと思います。
ありがとうございました。