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

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

ただいまの
回答率

90.51%

  • Python 3.x

    9841questions

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

  • API

    1825questions

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

  • PostgreSQL

    1357questions

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

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

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 775

y_uuuu

score 8

プログラミング初心者です。
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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

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ビルダーといったライブラリの導入を検討してみて下さい。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/02 19:10

    ご返信ありがとうございます。
    記述のとおり構文を修正し、解決いたしました。

    今後、余裕が生まれたら、ご紹介いただいたライブラリ周りも調べてみようと思います。

    ありがとうございました。


    キャンセル

同じタグがついた質問を見る

  • Python 3.x

    9841questions

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

  • API

    1825questions

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

  • PostgreSQL

    1357questions

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