【问题标题】:Json data not writing to SQLite DB - PythonJson 数据未写入 SQLite DB - Python
【发布时间】:2017-03-22 17:05:36
【问题描述】:

我的 Json 数据包含以下(但更大)

{
    "realms": [
        {

            "status": true,
            "battlegroup": "Shadowburn",
            "name": "Zuluhed",
            "locale": "en_US",
            "queue": false,
            "connected_realms": [
                "ursin",
                "andorhal",
                "scilla",
                "zuluhed"
            ],
            "timezone": "America/New_York",
            "type": "pvp",
            "slug": "zuluhed",
            "population": "medium"
        }
    ]
}

这是我的代码片段,应该将数据放入 db 文件 ( json 数据被加载到数据变量中(data = json.loads(response)) )

db=sqlite3.connect("temp.db")
c=db.cursor()
for record in data['realms']:
    c.execute('INSERT INTO realms (status, name, queue, timezone, type, population) VALUES (?,?,?,?,?,?)', (record['status'], record['name'],record['queue'], record['timezone'],record['type'], record['population']))

运行脚本运行没有错误,但检查表的内容没有任何内容

# sqlite3 temp.db
SQLite version 3.8.2 2013-12-06 14:53:30
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> SELECT * FROM "realms";
sqlite> 
sqlite> .tables
realms
sqlite>

我是 json 和 sqlite 的新手,所以我认为我做错了什么。 谢谢

【问题讨论】:

  • 后来你做了db.commit()吗?在您提交更改之前,光标不会更新表格。
  • 请将您的原始程序缩减为能证明问题的最短程序和数据集。请edit您的帖子并复制粘贴整个短程序和数据集,以及预期和实际输出。请参阅minimal reproducible example 了解更多信息。
  • 您没有描述您在何处/如何调用create table realms,并且该表没有出现在您检查的temp.db 中。您的 Python 写入的 temp.db 可能与您手动检查的 temp.db 位于不同的目录中。你能在你的 Python 程序中 print(os.getcwd()) 吗?
  • @roganjosh 这正是我忘记的,谢谢,如果您发表完整评论,请将其标记为答案。
  • @Robᵩ 请在请求您请求的信息之前再次阅读该问题,1) 由于所有数据都与 a] 我写给 db b 的内容有关,因此无法进一步减少问题把它写到 db 2) 我如何调用 temp.db 中的表并不重要,因为表存在 - 在 sqlite3 命令和子命令输出中看到,我不确定你是否读过这个问题,但表存在,如 sqlite 所见> .tables 领域

标签: python json sqlite


【解决方案1】:

您通过cursor 对象对数据库所做的任何更新在您提交之前都不会生效。在您的情况下,您与数据库的连接称为db (db=sqlite3.connect("temp.db")),因此您在INSERT 命令之后的某个位置需要db.commit()

【讨论】:

    【解决方案2】:

    您可以将整个 json 转储到 sqlite,然后从 db 中提取并做任何您想做的事情。

    db=sqlite3.connect("temp.db")
    cur = db.cursor()
    sql_create_data_table= """CREATE TABLE IF NOT EXISTS myrealms (
                                    id integer PRIMARY KEY AUTOINCREMENT,
                                    data json NOT NULL
                                ); """
    cur.execute(sql_create_data_table)
    

    插入:

    sql = '''INSERT INTO myrealms(data) VALUES(json('%s'))'''%json.dumps(response)
    cur.execute(sql)
    db.commit()
    

    从数据库中获取数据:

    cur.execute("SELECT * FROM myrealms")
    rows = cur.fetchall()
    print(rows)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-16
      • 2019-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多