【问题标题】:how to insert specific json into sqlite database using python 3如何使用python 3将特定的json插入sqlite数据库
【发布时间】:2015-05-19 03:49:28
【问题描述】:

使用 python 3,我想下载以 JSON 形式返回的 API 数据,然后我只想将特定的(列或字段或其他什么?)插入到 sqlite 数据库中。所以,这就是我所拥有的和我遇到的问题:

使用python的请求模块:

##### import modules

import sqlite3
import requests
import json

headers = {
'Authorization' : 'ujbOsdlknfsodiflksdonosB4aA=',
'Accept' : 'application/json'
}
r = requests.get(
'https://api.lendingclub.com/api/investor/v1/accounts/94837758/detailednotes',
 headers=headers
 )

好的,第一个问题是我如何将请求的 JSON 数据放入 python 可以使用的东西(字典?)中。那是……

jason.loads(r.text)

然后我创建要插入特定数据的表:

curs.execute('''CREATE TABLE data(
loanId INTEGER NOT NULL,
noteAmount REAL NOT NULL,
)''')

那里没问题...但是现在,即使 JSON 数据看起来像这样(尽管有数百条记录)...

{
"myNotes": [
{
    "loanId":11111,
    "noteId":22222,
    "orderId":33333,
    "purpose":"Debt consolidation",
    "canBeTraded":true,
    "creditTrend":"DOWN",
    "loanAmount":10800,
    "noteAmount":25,
    "paymentsReceived":5.88,
    "accruedInterest":12.1,
    "principalPending":20.94,
},
{
    "loanId":11111,
    "noteId":22222,
    "orderId":33333,
    "purpose":"Credit card refinancing",
    "canBeTraded":true,
    "creditTrend":"UP",
    "loanAmount":3000,
    "noteAmount":25,
    "paymentsReceived":7.65,
    "accruedInterest":11.92,
    "principalPending":19.76,
}]
}

我只想在 sqlite 数据库中插入 2 个数据点,即“loanId”和“noteAmount”。我相信将数据插入数据库会看起来像这样(但知道这是不正确的):

curs.execute('INSERT INTO data (loanId, noteAmount) VALUES (?,?)', (loanID, noteAmount))

但是我现在完全不知道该怎么做,所以我想我有两个主要问题;将下载的数据放入 python 可以使用的东西中,然后将特定数据插入数据库;然后我如何将数据从保存下载数据的对象插入数据库。我猜循环是答案的一部分......但是从什么开始?提前致谢!

【问题讨论】:

    标签: python json sqlite python-3.x


    【解决方案1】:

    首先,它是js = json.loads(r.text)`,所以你非常接近。

    接下来,如果您只想插入每条记录的 loanIDnoteAmount 字段,那么您需要循环并执行类似的操作

    for record in js['myNotes']:
        curs.execute('INSERT INTO data (loanId, noteAmount) VALUES (?,?)', (record['loanID'], record['noteAmount']))
    

    如果你稍微玩一下,你可以将 JSON 强制转换为 one big INSERT call

    【讨论】:

    • 感谢“js = json.loads(r.text)”评论,Celeo。终于解决了这个问题。
    【解决方案2】:

    正如the documentation 所说:

    sqlite3 模块支持两种占位符:问号 (qmark 样式)和命名占位符(命名样式)。

    请注意,您甚至可以使用executemany 一次插入所有行。 所以在你的情况下:

    curs.executemany('INSERT INTO data (loanId, noteAmount) '
                     'VALUES (:loanId,:noteAmount)', json.loads(...)['myNotes'])
    

    【讨论】:

    • 快到了。我想我现在有一个题外话的问题。一切似乎都很顺利,直到:“TypeError: JSON object must be str, not 'ellipsis'”
    • 抱歉,您必须插入 r.text 来代替省略号。代码 sn-p 旨在说明命名变量和 executemany 的使用,而不是可运行的。正如另一个答案中所指出的,您还可以使用 js 变量。
    • 其实不得不使用“r.text”。使用“js”变量给了我这个:JSON 对象必须是 str,而不是 'dict'。现在一切正常。非常感谢您和@Celeo
    • 哇这个插入INSERT INTO data (loadid, noteamount) values (:loadid, :noteamount) 应该在文档中。我已经花了几个小时试图“插入”字典。其他一切都很简单,但无法弄清楚“插入”
    猜你喜欢
    • 2011-09-20
    • 1970-01-01
    • 1970-01-01
    • 2017-12-31
    • 1970-01-01
    • 1970-01-01
    • 2021-10-16
    • 2016-09-16
    • 1970-01-01
    相关资源
    最近更新 更多