Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Python将RESTAPI中的JSON数据插入PostgreSQL表_Python_Json_Postgresql_Rest - Fatal编程技术网

使用Python将RESTAPI中的JSON数据插入PostgreSQL表

使用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

我试图将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(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”对象不可下标
。如果不想这样做,请使用列表。