我的任务是从 pokeapi 获取 JSON 数据,并使用 psycopg2 将其放入 pg4e 服务器(每个人都是 postgres)上的表中。
尽管我无法将 python 中的 JSON 数据放入服务器上表的 JSONB 列中,但它仍然有效。我尝试了很多机会,但我需要支持。
如何将保存在变量(文本)中的 JSON 放入表中?
提前非常感谢您
我的代码:
Imports...
conn...
cur...
sql = '''
CREATE TABLE IF NOT EXISTS pokeapi (id INTEGER, body JSONB);
'''
print(sql)
cur.execute(sql)
url = 'https://pokeapi.co/api/v2/pokemon/1'
print('=== Url is', url)
response = requests.get(url)
text = response.text
print('=== Text is', text)
text = json.loads(text)
sql = f'Insert into pokeapi (id, body) Values (1, 'text'::JSONB);'
cur.execute(sql, (text, url))
conn.commit()
cur.close()
回复:
如果不存在则创建表 pokeapi(id INTEGER,主体 JSONB);
=== 网址是 https://pokeapi.co/api/v2/pokemon/1 === 文本为 {"powered":[{"ability":{"name":"overgrow","url":"https://pokeapi.co/api/v2/ability/65/"}.. ..
第43行 sql = f'插入pokeapi(id, body) Values(1, 'text'::JSONB);' ^^^^ 语法错误:语法无效
由于字符串格式不正确,您收到语法错误,并且您还尝试使用变量插入 JSON。 这是应该有效的正确代码:
sql = '''
CREATE TABLE IF NOT EXISTS pokeapi (id INTEGER, body JSONB);
'''
cur.execute(sql)
url = 'https://pokeapi.co/api/v2/pokemon/1'
response = requests.get(url)
text = response.text
text_json = json.loads(text)
sql = 'INSERT INTO pokeapi (id, body) VALUES (%s, %s::JSONB);'
cur.execute(sql, (1, json.dumps(text_json)))
conn.commit()
cur.close()
conn.close()
如您所见,我使用 %s 作为参数的占位符,并将其值作为元组传递给
cur.execute()
我还通过
text_json
将
json.dumps()
转换回 json 字符串