2016-12-20 18 views
5

Düzenli aralıklarla bir API'dan bazı veriler alıyorum ve daha sonra erişmek ve kullanmak için JSON verilerini veritabanına depolamak istiyorum.JSON python veritabanına depolamak

'{"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'}]}}}' 

ben json_data = json.loads(above_data) ve sonra nodes bir listesini verir nodes_data = json_data["data"]["files"]["nodes"] olarak nodes getirebilir:

API itibaren bu örnekteki her zaman veri almak.

Bu nodes verilerini Text türünde data = Column(db.Text) DB sütununa kaydetmek istiyorum. Her seferinde düğüm listesinde 10-15 değer olacak.

Nasıl depolarım? Birden fazla nodes var ve gelecekte benim db içinde zaten kullanılabilir data sütun eklemek/eklemek daha fazla nodes bir şekilde ihtiyacım var.

Geçerli bir json alıyorum ve iç veri almak ve daha sonra kullanmak için nodes tüm üzerinde döngü olabilir, bu yüzden json.loads(db_data_col) yapmak istiyorum.

Db'de nasıl depolanacağım ve daha sonra geçerli json biçiminde erişilebileceğim konusunda kafam karıştı.

Düzenleme 1: Sqlite'i sınamak için kullanma. PostgresSQL'i gelecekte kullanabilir. Text sütun türü ana noktasıdır.

+2

Depolamak istediğiniz veritabanından bahsetmediniz. Uygulama veritabanı tipine bağlıdır.Ayrıca, google * json veri kaynağını * 'a yazarsanız, ne aradığınızı elde edersiniz –

+0

Ne tür bir veritabanı kullanıyorsunuz? Çoğu, JSON içeriğinin bir metin alanı içine bir dize olarak dilini almanızı sağlar. Postgres, JSON verilerini doğrudan bir alanda depolayabileceğiniz özel bir JSON tipine sahiptir. Diğerleri JSON verilerini işlemek için en az özel operatörlere sahiptir. –

+0

Eğer {"name": "hey", "count" gibi bir tek düğüm olması gerekiyorsa: 1} json.loads/dumps'ı körü körüne kullanabilirim. Benim endişem çok sayıda düğüm ve gelecekte daha fazla ekleme. – nml

cevap

1

JSON verilerini DB'ye depolamanın bir yolunu buldum. Her istekte list düğümlerini döndüren uzaktan hizmetten nodes'a eriştiğim için, db'den saklamak/almak için uygun json oluşturmam gerekiyor.

:

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

Şimdi DB sütuna 1 giriş için biz aşağıdakileri yapmanız gerekir: olarak '{"cursor": null, "nodes" = [{"name": "Test1", "value: 1}, {"name": "Test2", "value: 2}, ...]}'

Yani, önce biz düğümler listesine erişmek gerekir: olarak

Say API json metin döndü

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

str_datastr_data, 012 ile DB'ye depolayabileceğimiz geçerli bir dize/arabelleği döndürüranahtarı.

DB sütuna 2. veya ardışık girişler için

, aşağıdaki yapacağım:

# 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 

O/DB'den dökümü veri ekleme/json kaldırılması ve uygun biçimi tutarken yüklemek için uygun bir yoldur.

Teşekkürler!

0

Django 1.8 kullanıyorsanız, jsonu depolayabileceğiniz kendi model alanınızı oluşturabilirsiniz. Bu sınıf, doğru JSON formatına sahip olduğunuzdan emin olmanızı sağlayacaktır.

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

Bu sizin için mi çalışıyor? – nmusleh

+0

Hayır, Django gerekli değildir. – nml

İlgili konular