2016-12-20 8 views
5

定期的にAPIからデータを取得していて、アクセスして後で使用するためにJSONデータをデータベースに保存したいと考えています。PythonでデータベースにJSONを保存する

'{"data": {"cursor": null, "files": {"nodes": [{u'code': u'BOPhmYQg5Vm', u'date': 1482244678,u'counts': 2, u'id': u'1409492981312099686'}, {u'code': u'g5VmBOPhmYQ', u'date': 1482244678,u'counts': 5, u'id': u'1209968614094929813'}]}}}' 

私はjson_data = json.loads(above_data)、その後nodesのリストを与えるnodes_data = json_data["data"]["files"]["nodes"]としてnodesフェッチすることができます

はAPIから、私はこのサンプルで毎回データを取得します。

このnodesデータをdata = Column(db.Text)TextタイプのDB列に保存します。毎回、ノードリストに10〜15の値が入ります。

保存方法を教えてください。複数のnodesがあり、将来的には私のdbのdata列に既にnodesを追加/追加できるような方法で必要です。

json.loads(db_data_col)私は有効なjsonを取得し、nodesのすべてをループして内部データを取得し、後で使用できるようにしたいと思いますが。

DBに保存して後で有効なjson形式でアクセスする方法が混乱しています。

編集1:テスト用にSqliteを使用する。将来、PostgresSQLを使用することができます。 Textカラムのタイプが主なポイントです。

+2

保存したいデータベースについては言及していません。実装はデータベースの種類に依存します。また、google *でjsonデータソースを *に書き込むと、探しているものが得られます –

+0

どのような種類のデータベースを使用していますか?ほとんどの場合、JSONの内容を文字列としてテキストフィールドに書き込むことができます。 Postgresには専用のJSON型があり、JSONデータを直接フィールドに格納することができます。他の人には少なくともJSONデータを処理する特別な演算子があります。 –

+0

{"name": "hey"、 "count":1}のような単一のノードでなければならない場合、私は盲目的にjson.loads/dumpsを使用できます。私の心配は、多くのノードであり、将来的には多くを追加しています。 – nml

答えて

1

JSONデータをDBに保存する方法が見つかりました。私はlistのノードをすべての要求に返すリモートサービスからnodesにアクセスしているので、私は適切なjsonをビルドしてdbから取得する必要があります。

:我々は次の操作を行う必要があるDBの欄に第一のエントリのための今すぐ

data = json.loads(api_data) 
nodes = data['nodes'] 

:最初の私たちのように、ノードのリストにアクセスする必要がある、だから、'{"cursor": null, "nodes" = [{"name": "Test1", "value: 1}, {"name": "Test2", "value: 2}, ...]}'

セイAPIは、としてJSONテキストを返さ

str_data = json.dumps({"nodes": nodes})

したがって、str_dataは有効な文字列/バッファを返します。これは012にDBに格納できますキー。 DBの列に第2回または連続したエントリの場合

、我々は次の操作を行いますが:

# get data string from DB column and load into json 
db_data = json.loads(db_col_data) 
# get new/latest 'nodes' data from api as explained above 
# append this data to 'db_data' json as 
latest_data = db_data["nodes"] + new_api_nodes 
# now add this data back to column after json.dumps() 
db_col_data = json.dumps(latest_data) 
# add to DB col and DB commit 

それはJSONを追加/削除し、適切な形式を維持しながら、DBから/ダンプデータをロードするための適切な方法です。

ありがとうございます!

0

Django 1.8を使用している場合は、jsonを保存できる独自のモデルフィールドを作成できます。このクラスは正しいJSON形式を持っていることを確認します。

import json 
from django.db import models 

class JsonField(models.TextField): 
    """ 
    Stores json-able python objects as json. 
    """ 
    def get_db_prep_value(self, value, connection, prepared=False): 
     try: 
      return json.dumps(value) 
     except TypeError: 
      BAD_DATA.error(
       "cannot serialize %s to store in a JsonField", str(value) 
      ) 
      return "" 

    def from_db_value(self, value, expression, connection, context): 
     if value == "": 
      return None 
     try: 
      return json.loads(value) 
     except TypeError: 
      BAD_DATA.error("cannot load dictionary field -- type error") 
      return None 
+0

これはあなたのために機能しましたか? – nmusleh

+0

いいえ、Djangoは必須ではありません。 – nml

関連する問題