質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

解決済

1回答

4179閲覧

PythonにてAPIより取得した辞書データをPostgreSQLのテーブルに追加したい

y_uuuu

総合スコア16

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2017/09/01 14:18

プログラミング初心者です。
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') ^

辞書キーとテーブルのカラムを対応させ、値を入力したいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

単純にSQLの構文が誤っています。

sql

1INSERT INTO bitflyer (best_ask_size, total_bid_depth, product_code) VALUES (0.14722663, 4499.00718145, 'BTC_JPY');

というようにカラム名を宣言したあとに、VALUESでそのカラムに対応する値を入れます。

(ちなみに全カラムをテーブル定義の順番通りにINSERTする場合に限りカラム名を省略することもできますが、順番を間違えたり、テーブルの定義を変更したときにプログラムが動かなくなってしまうなどバグの温床になりやすいのでおすすめしません)

これを psycopg2 で実行するにはこんな感じになります:

python

1cur.execute( 2 'INSERT INTO bitflyer (best_ask_size, total_bid_depth, product_code) VALUES (%s, %s, %s);', 3 (0.14722663, 4499.00718145, 'BTC_JPY') 4)

実際にAPIから取得した結果を使う場合はこうですね:

python

1cur.execute( 2 'INSERT INTO bitflyer (best_ask_size, total_bid_depth, product_code) VALUES (%s, %s, %s);', 3 (a['best_ask_size'], a['total_bid_depth'], a['product_code']) 4)

もし「そんないちいちカラム名を指定してINSERTするのは面倒なので、辞書のキー名を使っていい感じにやってくれよ」という願望があるのであれば、ORマッパーやSQLビルダーといったライブラリの導入を検討してみて下さい。

投稿2017/09/02 01:21

miyahan

総合スコア3095

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_uuuu

2017/09/02 10:10

ご返信ありがとうございます。 記述のとおり構文を修正し、解決いたしました。 今後、余裕が生まれたら、ご紹介いただいたライブラリ周りも調べてみようと思います。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問