python - 将json插入postgres python
问题描述
嗨,我想从输出为 JSON 格式的 api 请求数据。我想从 API 中获取数据并将其插入到 postgress 数据库中,但出现以下错误
Traceback (most recent call last):
File "/Users/xxx/text.py", line 17, in <module>
cur.execute("INSERT INTO Boliga VALUES (%s)", [Json(data)])
psycopg2.errors.InvalidTextRepresentation: invalid input syntax for type double precision: ""[\n {\n \"estateId\": 1735758,\n \"address\": \"Dysseaasen 15A\",\n \"zipCode\": 2600,\n \"price\": 5603000,\n \"soldDate\": \"2021-05-31T22:00:00.000Z\",\n \"propertyType\": 1,\n \"saleType\": \"Alm. Salg\",\n \"sqmPrice\": 35018.75,\n \"rooms\": 6.0,\n \"size\": 160,\n \"buildYear\": 2019,\n \"change\": 2.9017446,\n \"guid\": \"18C3917E-E80F-4FF1-BAAA-05DCFF36938C\",\n \"latitude\": 55.683464,\n \"longitude\": 12.424398,\n \"municipalityCode\": 161,\n \"estateCode\": 319,\n \"city\": \"Glostrup\",\n \"groupKey\": null,\n \"canGetVR\": true\n },\n {\n \"estateId\": 0,\n \"address\": \"Skovbrynet 34\",\n \"zipCode\": 9330,\n \"price\": 1111111,\n \"soldDate\": \"2021-05-28T22:00:00.000Z\",\n \"propertyType\": 1,\n \"saleType\": \"Alm. Salg\",\n \"sqmPrice\": 7507.507,\n \"rooms\": 5.0,\n \"size\": 148,\n \"buildYear\": 1977,\n \"change\": 0.0,\n \"guid\": \"94199131-1023-496C-89F4-0FA101D80269\",\n \"latitude\": 57.160492,\n \"longitude\": 10.28083,\n \"municipalityCode\": 810,\n \"estateCode\": 14258,\n \"city\": \"Dronninglund\",\n \"groupKey\": null,\n \"canGetVR\": true\n }\n]""
我有以下python代码
import requests as r
import json
import psycopg2
import psycopg2.extras
from psycopg2.extras import Json
import pandas as pd
d=r.get('https://api.boliga.dk/api/v2/sold/search/results?pageSize=2').json()
data=json.dumps(d['results'], indent=1,ensure_ascii=False)
DB_HOST = "localhost"
DB_NAME = "bolig"
DB_USER = "postgres"
DB_PASS = "Password"
con = psycopg2.connect(dbname=DB_NAME, user=DB_USER, password=DB_PASS, host=DB_HOST)
cur= con.cursor()
cur.execute("INSERT INTO Boliga VALUES (%s)", [Json(data)])
我的桌子看起来像这样
estateid | address | zipcode | price | solddate | propertytype | saletype | sqmprice | rooms | size | buildyear | change | guid | latitude | longitude | municipalitycode | estatecode | city | groupkey | cangetvr
----------+---------+---------+-------+----------+--------------+----------+----------+-------+------+-----------+--------+------+----------+-----------+------------------+------------+------+----------+----------
解决方案
不要重新字符串化请求
您的响应似乎是一个列表,而不是可以展平为列的单个对象。
查阅文档,您可以看到他们Json()
围绕标准 Python 字典而不是列表而不是字符串调用。
所以,试试下面的
d = r.get('https://api.boliga.dk/api/v2/sold/search/results?pageSize=2').json()
con = psycopg2.connect(dbname=DB_NAME, user=DB_USER, password=DB_PASS, host=DB_HOST)
cur = con.cursor()
for obj in d:
cur.execute("INSERT INTO Boliga VALUES (%s)", [ Json(obj) ])
# be sure to commit/close the cursor
如果这不起作用,您可能需要调整某些数据库字段的大小写以匹配 JSON 响应,或者自己解析响应并修复字段名称
推荐阅读
- javascript - 如何检查应用程序是否在 Reactjs App 的另一个选项卡中打开
- android - Android - 如何创建 CheckBox 可绘制对象?
- vue.js - 同一页面的参数 id 更改上的 Vue 刷新页面
- postgresql - 如何在 Slick 中将案例类映射为 postgresql 列
- postgresql - 如何使用相应的 varchar 列生成日期系列
- oracle - 如何使用设置超时的 entityManager 有效地更新
- flutter - 当我使用 flutter_screenutil 或 sizer 包时,我无法声明“家”。我收到错误参数“home”未定义
- postman - 授权 Oauth2.0 添加额外的正文参数
- sql - 将多列转换为 Bigquery 中的记录
- python - 实值数组的 rfft 幅度