【问题标题】:json data insertion problem in postgresql database with python使用python在postgresql数据库中插入json数据问题
【发布时间】:2019-03-03 14:17:09
【问题描述】:

main.py

data = []
with open('data.json') as f:
    for line in f:
        data.append(json.loads(line))
f.close()

fields = [
    'id', #integer
    'name', #varchar
    'log_date', #date
    'log_time', #timestamp
    'login', #timestamp
    'logout' #timestamp
]

for item in data:
    my_data = [item[field] for field in fields]
    insert_query = "INSERT INTO employee VALUES (%d, %s, %s, %s, %s, %s)"
    cur.execute(insert_query, tuple(my_data))

data.json

[
    {
        "id": 1,
        "name": "Prosenjit Das",
        "log_date": "2019-03-02",
        "log_time": "12:10:12.247257",
        "login": null,
        "logout": null
    },
    {
        "id": 2,
        "name": "Sudipto Rahman",
        "log_date": "2019-03-02",
        "log_time": "12:10:12.247257",
        "login": "11:26:45",
        "logout": "10:49:53"
    },
    {
        "id": 3,
        "name": "Trump Khatun",
        "log_date": "2019-03-02",
        "log_time": "12:10:12.247257",
        "login": null,
        "logout": null
    }
]

postgresql 列字段

我的数据库连接正常。在该图片的第 37 行中,当我使用转储而不是加载时,第 50 行显示了另一个问题,即“类型错误:字符串索引必须是整数”。 注意这里的 json 格式类型是一个列表。 这类问题,但不完全是我见过的很多,但不能正常工作。

谢谢。

【问题讨论】:

  • json 无效,因为您在数组中的最后一个对象后面有一个尾随逗号,删除该逗号并尝试再次读取它,也不要读取 json 文件行一行一行,一口气读完
  • 从@aws_apprentice 开始,每当使用json 文件时,我喜欢将内容粘贴到jsonformatter.curiousconcept.com 以在运行程序之前检查其语法是否正确
  • @aws_apprentice 谢谢。但是我从 API 获得的这个 json 数据。那么在这种情况下,我可以在检索 json 数据后删除逗号吗?
  • 这里还有其他问题,特别是您需要指定要插入的列,因为您没有上传表中存在的所有列
  • @Prosenjit 你必须修改它以符合 json 标准,否则它不是有效的 json

标签: python json database postgresql file


【解决方案1】:

所以我会在这里做一些改变

with open('data.json') as f:
    data = json.load(f)

# no need to do f.close() since we are using a context manager

fields = [
    'id', #integer
    'name', #varchar
    'log_date', #date
    'log_time', #timestamp
    'login', #timestamp
    'logout' #timestamp
]

for item in data:
    my_data = [item[field] for field in fields]
    insert_query = "INSERT INTO employee (id, name, log_date, log_time, login, logout) VALUES (%s, %s, %s, %s, %s, %s)"

    # also ALL placeholders must be %s even if it is an integer
    cur.execute(insert_query, tuple(my_data))

此外,如果您将 psycopg2 模块用于您的数据库操作,您可以执行以下操作

from psycopg2.extras import execute_values

my_data = [tuple(item[field] for field in fields) for item in data]
insert_query = "INSERT INTO employee (id, name, log_date, log_time, login, logout) VALUES %s"
execute_values(cursor, insert_query, my_data) 

【讨论】:

  • 对不起,我还没有找到尾随逗号标准解决方案
  • 你说你的 json 是有效的并且没有尾随逗号
  • 是的,这表明有效。你可以试试我上面给出的pastebin链接我的json数据在你给我的那个网站上。
【解决方案2】:

将 json 加载到字典列表中一次 + 删除多余的逗号

import json

with open('data.json', 'r') as f:
    data = json.load(f)
# now  you can iterate and push to entries to DB

数据.json

[
    {
        "id": 1,
        "name": "Prosenjit Das",
        "log_date": "2019-03-02",
        "log_time": "12:10:12.247257",
        "login": null,
        "logout": null
    },
    {
        "id": 2,
        "name": "Sudipto Rahman",
        "log_date": "2019-03-02",
        "log_time": "12:10:12.247257",
        "login": "11:26:45",
        "logout": "10:49:53"
    },
    {
        "id": 3,
        "name": "Trump Khatun",
        "log_date": "2019-03-02",
        "log_time": "12:10:12.247257",
        "login": null,
        "logout": null
    }, --> was removed
]

【讨论】:

  • 我在最后使用了那个逗号,但得到了相同的输出。 jsonformatter.curiousconcept.com 在这个站点中我测试了我的 json 数据 pastebin.com/DkVcNbmc 并显示有效。这里发生了什么实际上我无法理解我必须移动哪个逗号。只是你可以检查我的 json 数据是否有效。
  • Json 看起来不错。你还有什么问题吗?
  • 没有。只有我遇到过这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-15
相关资源
最近更新 更多