将 JSON 插入 PostgreSQL 数据库:并非所有参数都在字符串格式化期间转换

Inserting JSON into a PostgreSQL database: not all arguments converted during string formatting

我正在尝试在 python 脚本中使用 PostgreSQL 在 JSONB 列中插入一个 JSON 文件。

首先我将 csv 文件加载到数据框中,填充了一些 NaN 并将其转储到 JSON:

df = pd.read_csv("casos.csv", names=["casos"], encoding ="utf-8", engine='python')
df2 = pd.read_csv("corregimientos.csv", encoding="utf-8", engine='python')
df2 = df2.replace(np.nan, None, regex=True)
df2 = pd.concat([df2, df], axis = 1)


for column in range(0,3,1):
   for row in range(len(df2)):
     if df2.iloc[row,column] is not None:
         val = df2.iloc[row,column]
     elif df2.iloc[row,column] is None:
         df2.iloc[row,column] = val


jCorreg = df2.to_json(orient = "records", lines = True)


jCorreg = [json.loads(line) for line in open('corregimientos.json', 'r')]

这是我的代码:

cur.execute(''' CREATE TABLE casos (
                    id serial NOT NULL  PRIMARY KEY,
                    nlcasos JSONB NOT NULL);''')

cur.execute('INSERT INTO casos (nlcasos) VALUES (%s)',jCorreg)

当我尝试从 JSON 插入数据时,出现上述错误。

TypeError: not all arguments converted during string formatting

我不确定如何解决这个问题。我也试过像这样插入:

cur.execute('INSERT INTO casos (nlcasos) VALUES ("'+jCorreg+'")')

但最终出现了另一个错误,我假设这是因为它认为我的字符串的末尾是另一个 (")。

SyntaxError: syntax error at or near "provincia"
LINE 3:         "provincia": "Bocas del Toro",

JSON jCorreg 文件如下所示:

{"provincia":"Bocas del Toro","distrito":"Almirante","corregimientos":"Puerto Almirante","sede del distrito":"Puerto Almirante","casos":303}
{"provincia":"Bocas del Toro","distrito":"Almirante","corregimientos":"Barriada Guaym\u00ed","sede del distrito":"Puerto Almirante","casos":386}
{"provincia":"Bocas del Toro","distrito":"Almirante","corregimientos":"Barrio Franc\u00e9s","sede del distrito":"Puerto Almirante","casos":104}

以此类推

我通过改变一些东西设法解决了它。 我使用 json.loads()

将 jCorreg json 变成了字典
jCorreg = [json.loads(line) for line in open('corregimientos.json', 'r')]

在那之后,我只是在 [] 中添加了一个 json.dumps() 到我的数据库插入语句中,其中包含一个 for:

for line in jCorreg:
      cur.execute('''INSERT INTO casos (nlcasos) VALUES (%s)''', [json.dumps(line)])

我也试过把插入语句改成:

for line in jCorreg:
      cur.execute('''INSERT INTO casos (nlcasos) VALUES (%s)''', [line])

无需将 JSON 更改为字典,它也有效。