python - 如何使用 python 插入 PostgreSQL 中的 JSONB 列?
问题描述
[解决了。.... 但]
我正在使用 python 在 PostgreSQL 数据库中插入一些数据。该代码适用于任何其他表。但是,当我有一个 JSONB 列并从 api 插入数据时,发生了这个错误:
psycopg2.errors.SyntaxError: syntax error at or near "{"
LINE 1: INSERT INTO pokeapi(id, body) VALUES (0, {"abilities":[{"abi...
这是整个代码:
import psycopg2
import hidden
import time
import myutils
import requests
import json
secrets = hidden.secrets()
print(secrets)
conn = psycopg2.connect(host=secrets['host'],
port=secrets['port'],
database=secrets['database'],
user=secrets['user'],
password=secrets['pass'],
connect_timeout=3)
cur = conn.cursor()
defaulturl = 'https://pokeapi.co/api/v2/pokemon/'
print('If you want to restart the spider, run')
print('DROP TABLE IF EXISTS pokeapi CASCADE;')
print(' ')
createpokeapi = '''
DROP TABLE IF EXISTS pokeapi CASCADE;
CREATE TABLE IF NOT EXISTS pokeapi (id INTEGER, body JSONB);
'''
print(createpokeapi)
cur.execute(createpokeapi)
pkval = int(input('How many rows? : '))
for i in range(0, pkval):
furl = f"https://pokeapi.co/api/v2/pokemon/{i+1}/"
print(furl)
result = requests.get(furl)
jsdata = result.text
print(jsdata)
sql = f'INSERT INTO pokeapi(id, body) VALUES ({i}, {jsdata} )';
print(sql)
cur.execute(sql)
if i % 5 == 0:
conn.commit()
print('Closing database connection...')
conn.commit()
cur.close()
此错误发生在第一次插入时。没有插入数据。我用 interger/varchar 列而不是 JSONB 插入了 interger/varchar 数据类型,它可以工作。尝试在谷歌上搜索超过 6 小时。我的具体问题没有运气。可能是什么解决方案?或任何提示?
到目前为止我的解决方案:
我刚刚更改了第 62 和 63 行:
# sql = f'INSERT INTO pokecheckapi(id, body) VALUES ({i}, {jsdata} )';
# cur.execute(sql)
至
sql = 'INSERT INTO pokecheckapi(id, body) VALUES ( %s, %s )';
cur.execute(sql, (i, jsdata))
它有效。我能得到一个很好的解释吗?任何人 ??