我正在使用 Python 从 REST API 中提取数据并将其存储在 SQL 数据库中。除了响应中的一个 JSON 值之外,一切工作正常。
JSON 响应
[ { "pbxId": "XXXcxx", "site": "XXX Group - Sydney Office", "name": "XXXX Service", "extension": "622", "totalMembers": 3, "totalInbound": 1, "totalAbandoned": 0, "totalAnswered": 1, "totalMissed": 0, "totalCallsToVM": 0, "totalAdvanced": 0, "totalRgTime": 36339, "totalTalkTime": 25613, "totalCalls": 1, "avgAbandonedTime": 0, "avgRgTime": 36339, "avgRingTime": 10726, "avgTalkTime": 25613, "totalAbandonedTime": 0, "totalRingTime": 10726 } ]
response2 = requests.get(url, headers=headers) d =json.loads(response2.text) cdr =json_normalize(d) print(cdr)
当我打印响应时,“名称”值显示正确。
然后我将其插入 SQL DB
conn = pyodbc.connect(connectionString) df = pd.DataFrame(cdr, columns = ['pbxId','site','name','extension',....'totalRingTime']) df.columns = ['pbxId','site','name','extension',.....'totalRingTime'] #print(df) cursor = conn.cursor() df = df.astype(object).where(pd.notnull(df),None) for index, row in df.iterrows(): cursor.execute("INSERT INTO eightwave_RingGroupSummary values(?,?,?,?,...,?,?,?,?,?)",row.pbxId,row.site,str(row.name),row.extension,int(row.totalMembers),int(row.totalInbound),....int(row.totalRingTime)) cursor.commit() cursor.close() conn.close()
此处的值“名称”变成数字。并且它不断增加。例如,当 df 中有两行时,名称值变为 0 和 1 等。
任何帮助表示赞赏。
TIA
我希望该值与从 API 返回的值相同。我尝试删除 str() 类型转换
问题出在这一行代码,你使用
df.astype(object).where(pd.notnull(df), None)
将 DataFrame 中的所有列都转换为
object
类型,然后再将其插入数据库:
df = df.astype(object).where(pd.notnull(df), None)
由于
object
类型可以存储任何 Python 对象,包括数字和字符串,因此当你在数据库中插入
object
类型的数据时,数据库驱动程序会尝试根据数据本身的类型来自动推断其数据类型。
对于你的 "name" 列来说,虽然它最初存储的是字符串值,但在转换为
object
类型之后,它变成了可以存储任何 Python 对象的容器。当数据库驱动程序尝试推断其数据类型时,它可能会将字符串解释为数字,因为字符串中可能只包含数字字符。
解决方案:
你不需要将整个 DataFrame 转换为
object
类型。你可以直接将 DataFrame 插入数据库,数据库驱动程序会根据每列的数据类型自动进行转换。
修改你的代码,移除
df = df.astype(object).where(pd.notnull(df), None)
这一行,然后直接使用
df
插入数据库:
conn = pyodbc.connect(connectionString)
df = pd.DataFrame(cdr, columns=['pbxId', 'site', 'name', 'extension', ..., 'totalRingTime'])
df.columns = ['pbxId', 'site', 'name', 'extension', ..., 'totalRingTime']
cursor = conn.cursor()
for index, row in df.iterrows():
cursor.execute(
"INSERT INTO eightwave_RingGroupSummary values(?,?,?,?,...,?,?,?,?,?)",
row.pbxId, row.site, row.name, row.extension, row.totalMembers, row.totalInbound, ...,
row.totalRingTime
)
cursor.commit()
cursor.close()
conn.close()
这样,数据库驱动程序会将 "name" 列正确识别为字符串类型,并在数据库中存储为字符串。
标签:python,pandas From: 78791474