将 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 更改为字典,它也有效。
我正在尝试在 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 更改为字典,它也有效。