将结果字典从API保存到数据库-Psycopg2

时间:2019-07-19 12:30:21

标签: python json python-requests psycopg2

我想在数据库的某个表上保存一个API响应,我正在将Postgres与psycopg2一起使用。

这是我的代码:

import json
import requests
import psycopg2

def my_func():
    response = requests.get("https://path/to/api/")
    data = response.json()

    while data['next'] is not None:
        response = requests.get(data['next'])
        data = response.json()
        for item in data['results']:
            try:
                connection = psycopg2.connect(user="user",
                                          password="user",
                                          host="127.0.0.1",
                                          port="5432",
                                          database="mydb")
                cursor = connection.cursor()

                postgres_insert_query = """ INSERT INTO table_items (NAME VALUES (%s)"""
                record_to_insert = print(item['name']) 
                cursor.execute(postgres_insert_query, record_to_insert)
                connection.commit()
                count = cursor.rowcount
                print (count, "success")
            except (Exception, psycopg2.Error) as error :
                if(connection):
                    print("error", error)
            finally:
                if(connection):
                    cursor.close()
                    connection.close()

my_func()

我的意思是,我只是想将request的所有结果数据“打印”到数据库中,有没有办法做到这一点?

我有点困惑,如您所见,我的意思是,实现此目标的“打印”内容是什么?

我的意思是,我只想将API响应中的name字段保存到数据库表中。还是实际上INSERT我猜psycopg2在这种情况下具有某种功能?

您能提供任何示例吗?

编辑

对不起,我忘了,如果我运行这段代码,它将抛出该错误:

PostgreSQL connection is closed
A particular name
Failed to insert record into table_items table syntax error at or near "VALUES"
LINE 1:  INSERT INTO table_items (NAME VALUES (%s)

1 个答案:

答案 0 :(得分:1)

这里有一些问题。我不确定该API是什么还是返回什么,但是我将基于这些做出一些假设和建议。

您的查询中存在语法错误,缺少),应为: postgres_insert_query = 'INSERT INTO table_items (NAME) VALUES (%s)' (I'm also assuming that NAME`是数据库中的真实列)。

即使进行了此更正,您仍然会遇到以下问题: record_to_insert = print(item['name'])会将record_to_insert设置为Noneprint函数的返回值始终为None。该行应改为:

record_to_insert = item['name']

(假设字典name中的键item实际上是您要查找的字段)

我相信对execute的调用必须将替换作为一个元组传递,因此行cursor.execute(postgres_insert_query, record_to_insert)应该是:

cursor.execute(postgres_insert_query, (record_to_insert,))