我想在数据库的某个表上保存一个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)
答案 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
设置为None
。 print
函数的返回值始终为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,))