使用Python将RESTAPI中的JSON数据插入PostgreSQL表
我试图将json api的每个元素插入到我的postgres表中 但我得到了以下错误:使用Python将RESTAPI中的JSON数据插入PostgreSQL表,python,json,postgresql,rest,Python,Json,Postgresql,Rest,我试图将json api的每个元素插入到我的postgres表中 但我得到了以下错误: Traceback (most recent call last): File "c:/Users/myname/Documents/repos/docker-playground/parse_json_to_postgres.py", line 20, in <module> cursor.execute(f"INSERT into catfacts(d
Traceback (most recent call last):
File "c:/Users/myname/Documents/repos/docker-playground/parse_json_to_postgres.py", line 20, in <module>
cursor.execute(f"INSERT into catfacts(data) VALUES ( {cat_fact} )")
psycopg2.errors.SyntaxError: syntax error at or near "{"
LINE 1: INSERT into catfacts(data) VALUES ( {'status': {'verified':...
^
将数据插入表的MyPython代码:
CREATE TABLE cat_facts (
id serial NOT NULL PRIMARY KEY,
data jsonb NOT NULL
);
import requests, json, psycopg2
cat_facts_json = requests.get('https://cat-fact.herokuapp.com/facts').json
conn = psycopg2.connect(user="postgres",
password="password",
host="localhost",
port="5432",
database="postgres")
cursor = conn.cursor()
for cat_fact in cat_facts_json():
cursor.execute(f"INSERT into catfacts(data) VALUES ( \' {cat_fact} \' )")
INSERT INTO cat_facts(data) VALUES ('{"status":{"verified":true,"sentCount":1},"type":"cat","deleted":false,"_id":"58e008800aac31001185ed07","user":"58e007480aac31001185ecef","text":"Wikipedia has a recording of a cat meowing, because why not?","__v":0,"source":"user","updatedAt":"2020-08-23T20:20:01.611Z","createdAt":"2018-03-06T21:20:03.505Z","used":false}');
INSERT INTO cat_facts(data) VALUES ('{"status":{"verified":true,"sentCount":1},"type":"cat","deleted":false,"_id":"58e008630aac31001185ed01","user":"58e007480aac31001185ecef","text":"When cats grimace, they are usually \"taste-scenting.\" They have an extra organ that, with some breathing control, allows the cats to taste-sense the air.","__v":0,"source":"user","updatedAt":"2020-08-23T20:20:01.611Z","createdAt":"2018-02-07T21:20:02.903Z","used":false},{"status":{"verified":true,"sentCount":1},"type":"cat","deleted":false,"_id":"58e00a090aac31001185ed16","user":"58e007480aac31001185ecef","text":"Cats make more than 100 different sounds whereas dogs make around 10.","__v":0,"source":"user","updatedAt":"2020-08-23T20:20:01.611Z","createdAt":"2018-02-11T21:20:03.745Z","used":false}');
....
API=
我正在努力实现的目标:
CREATE TABLE cat_facts (
id serial NOT NULL PRIMARY KEY,
data jsonb NOT NULL
);
import requests, json, psycopg2
cat_facts_json = requests.get('https://cat-fact.herokuapp.com/facts').json
conn = psycopg2.connect(user="postgres",
password="password",
host="localhost",
port="5432",
database="postgres")
cursor = conn.cursor()
for cat_fact in cat_facts_json():
cursor.execute(f"INSERT into catfacts(data) VALUES ( \' {cat_fact} \' )")
INSERT INTO cat_facts(data) VALUES ('{"status":{"verified":true,"sentCount":1},"type":"cat","deleted":false,"_id":"58e008800aac31001185ed07","user":"58e007480aac31001185ecef","text":"Wikipedia has a recording of a cat meowing, because why not?","__v":0,"source":"user","updatedAt":"2020-08-23T20:20:01.611Z","createdAt":"2018-03-06T21:20:03.505Z","used":false}');
INSERT INTO cat_facts(data) VALUES ('{"status":{"verified":true,"sentCount":1},"type":"cat","deleted":false,"_id":"58e008630aac31001185ed01","user":"58e007480aac31001185ecef","text":"When cats grimace, they are usually \"taste-scenting.\" They have an extra organ that, with some breathing control, allows the cats to taste-sense the air.","__v":0,"source":"user","updatedAt":"2020-08-23T20:20:01.611Z","createdAt":"2018-02-07T21:20:02.903Z","used":false},{"status":{"verified":true,"sentCount":1},"type":"cat","deleted":false,"_id":"58e00a090aac31001185ed16","user":"58e007480aac31001185ecef","text":"Cats make more than 100 different sounds whereas dogs make around 10.","__v":0,"source":"user","updatedAt":"2020-08-23T20:20:01.611Z","createdAt":"2018-02-11T21:20:03.745Z","used":false}');
....
请参见此处
比如:
from psycopg2.extras import Json
cursor.execute("INSERT into catfacts(data) VALUES (%s)", [Json(cat_fact)])
我现在开始工作了:
for cat_fact in cat_facts_json:
data = json.dumps(cat_fact)
insert_query = "insert into cat_facts (data) values (%s) returning data"
cursor.execute(insert_query, (data,))
conn.commit()
conn.close()
我考虑了你对Stefano Frazzetto和Adrian Klaver的评论
- json.dumps有效李>
- 我没有直接在执行查询中执行参数
cursor.execute(insert_query, (data,))
你看过这里的答案了吗?除了@StefanoFrazzetto post外,请参见此部分,了解不应使用格式化字符串的原因。@Adriankeraver我喜欢文档部分,其中说:“永远,永远,永远,永远,永远,永远,永远,永远,永远,永远,永远,永远,永远,永远,永远,永远,永远,永远,永远,永远,永远,永远,永远,永远,永远,永远,永远,永远,永远,永远,永远,永远,永远,永远,永远,永远,永远,永远,永远,永远,永远,永远,我在cat_facts_json()中的cat_facts中尝试了这个方法:cursor.execute(“插入到catfacts(数据)值(%s)”%json.dumps(cat_facts)),但仍然没有出现相同的错误。对于cat_facts_json()中的cat_facts,这个方法是:sql=“插入catfacts(数据)值(%s)”游标。执行(sql,cat_事实)retuns:Traceback(最近一次调用):游标中第33行的文件“c:/Users/user/Documents/repos/docker Playerly/parse_json_to_postgres.py”。执行(sql,cat_事实)TypeError:dict不是一个序列还不完全存在,但更接近。打印工作,它返回每个cat事实对象。插入不知何故不工作。对于cat_事实中的cat_事实,json:print(cat_事实)cursor.execute(“insert into cat_事实(数据)值(%s)”、[json(cat_事实)]和missed(),在我的get查询中,现在是requests.get(“而不是requests.get”()。谢谢Adrian,请将此添加到您的问题中,以便正确格式化。当您这样做时,还包括
print(cat\u fact)
的结果。还要定义“not working”。我的回答假设cat\u fact
是一个Python对象,就像您从json.loads(json\u str)中得到的一样
。这是一个漫长的过程:insert\u query=“insert into cat\u facts(data)value(%s)returning data”游标。execute(insert\u query,(Json(cat\u fact))
(data,)
是一个元组,Python语法要求它有一个逗号,以区别于括号中的值,因此:t=(1,)t[0]1,t=(1)t[0]“int”对象不可下标
。如果不想这样做,请使用列表。