Cílení konkrétní hodnoty z JSON API a vkládání do Postgresql, Python

hlasů
1

Právě teď jsem schopen se připojit k API URL a mé databáze. Snažím se vložit data z adresy URL do databáze postgresql pomocí psycopg2. I dont plně pochopit, jak to udělat, a to je vše, co jsem mohl přijít s to udělat.

import urllib3
import json
import certifi
import psycopg2
from psycopg2.extras import Json


http = urllib3.PoolManager(
    cert_reqs='CERT_REQUIRED',
    ca_certs=certifi.where())
url = '<API-URL>'
headers = urllib3.util.make_headers(basic_auth='<user>:<passowrd>')
r = http.request('GET', url, headers=headers)
data = json.loads(r.data.decode('utf-8'))


def insert_into_table(data):

    for item in data['issues']:
        item['id'] = Json(item['id'])

    with psycopg2.connect(database='test3', user='<username>', password='<password>', host='localhost') as conn:
        with conn.cursor() as cursor:
            query = 
                INSERT into
                     Countries
                    (revenue)
                VALUES
                    (%(id)s);
            
            cursor.executemany(query, data)

        conn.commit()


insert_into_table(data)

Takže tento kód dej mi TypeError: string indices must be integersna cursor.executemany(query, data)

Takže vím, že json.loads vrací objekt typu a že json.dumps přináší typu řetězec. Nebyl jsem si jistý, který z nich bych měl používat. a vím, že jsem zcela chybí něco o tom, jak im zaměřená na hodnotu ‚id‘, a jeho vložení do dotazu.

Také málo o API je velmi rozsáhlé a složité a nakonec budu muset jít dolů více stromů chytit určité hodnoty, zde je příklad toho, co já jsem tahání vybírat.

Snažím se chytit „id“ v rámci „záležitostí“ a ne „typ problému“

{
  expand: <>,
  startAt: 0,
  maxResults: 50,
  total: 13372,
  issues: [
    {
      expand: <>,
      id: 41508,
      self: <>,
      key: <>,
      fields: {
        issuetype: {
          self: <>,
          id: 1,
          description: <>,
          iconUrl: <>,
          name: <>,
          subtask: <>,
          avatarId: <>
        },
Položena 27/11/2018 v 18:00
zdroj uživatelem
V jiných jazycích...                            


3 odpovědí

hlasů
1

Za prvé, extrahovat idsdo seznamu tic:

ids = list((item['id'],) for item in data['issues'])
# example ids: [('41508',), ('41509',)]

Vedle možné použít funkční extras.execute_values ():

from psycopg2 import extras

query = """
    INSERT into Countries (revenue)
    VALUES %s;
"""
extras.execute_values(cursor, query, ids)

Proto jsem se dostat chyby typu?

Druhý argument funkce executemany (dotazu vars_list) by měla být sekvence, když dataje objekt, který prvky nelze přistupovat pomocí celočíselné indexy.

Proč používat execute_values()místo executemany()?

Vzhledem k výkonu, první funkce vykoná jeden dotaz s více argumentů, zatímco druhá provádí tolik dotazů jako argumenty.

Všimněte si, že ve výchozím nastavení třetí argument execute_values()je seznam tic, takže jsme získali idsprávě tímto způsobem.

Pokud se mají vložit hodnoty do více než jednoho sloupce, přičemž každá n-tice v seznamu by mělo obsahovat všechny hodnoty jednoho vloženého řádku, například:

values = list((item['id'], item['key']) for item in data['issues'])

query = """
    INSERT into Countries (id, revenue)
    VALUES %s;
"""
extras.execute_values(cur, query, values)
Odpovězeno 27/11/2018 v 19:36
zdroj uživatelem

hlasů
1

Otázkou jste není tak, jak si je rozebrat svůj JSON, to nastane, když se ji pokusíte vložit do tabulky pomocí cursor.executemany().

dataje jeden objekt, Pokoušíte vložit všechna data svého načtení se vrátí do své tabulky najednou? Nebo se snažíte vložit určitou část dat ( seznam těchto vydání ID )?

Předáváte datado cursor.executemanyhovoru. dataje objekt. Věřím, že budete chtít projít data.issues, což je seznam otázek, které jste změnili.

Pokud si jen chcete vložit tyto identifikátory do tabulky zkuste toto:

def insert_into_table(data):

    with psycopg2.connect(database='test3', user='<username>', password='<password>', host='localhost') as conn:
        with conn.cursor() as cursor:
            query = """
            INSERT into
                 Countries
                (revenue)
            VALUES
                (%(id)s);
            """
            for item in data['issues']:
               item['id'] = Json(item['id'])
               cursor.execute(query, item['id')

            conn.commit()


insert_into_table(data)

Pokud si přejete zachovat efektivitu využití cursor.executemany()je nutné vytvořit pole identifikátorů, neboť stávající objekt struktura nesjedná jim způsob, jakým se cursor.executemany()vyžaduje.

Odpovězeno 27/11/2018 v 19:29
zdroj uživatelem

hlasů
1

Pokud jste se snaží dostat jen id a vložte ji do tabulky, měli byste se pokusit

ids = []
for i in data['issues']:
     ids.append(i['id'])

Pak můžete projít svůj idsseznam na vás cursor.executemanyfungovat.

Odpovězeno 27/11/2018 v 19:12
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more