首页 > 解决方案 > 如何使用 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))

它有效。我能得到一个很好的解释吗?任何人 ??

标签: pythonjsonpostgresqlpsycopg2jsonb

解决方案


推荐阅读