【问题标题】:Best approach to JSON info to insert into a database将 JSON 信息插入数据库的最佳方法
【发布时间】:2021-05-19 17:01:36
【问题描述】:

我已经设法从 API 中提取了一些信息,但它的格式对于像我这样的新手程序员来说很难。我可以将它保存到文件或将其移动到新列表等,但让我感到困惑的是我是否应该不弄乱数据并按原样插入,或者 - 我是否将其变成人类类型的格式并基本上将其解构为之后使用?

JSON 已经很困难了,因为它在嵌套字典中,并且值是一个列表。因此,在尝试完之后,我希望它实际上位于数据库中。我现在使用postgresql作为数据库,正在学习python。

    response = requests.post(url3, headers=headers)
jsonResponse = response.json()
my_data = jsonResponse['message_response']['scanresults'][:]
store_list = []

for item in my_data:
    dev_details = {"mac":None, "user":None, "resource_name":None}
    dev_details['mac'] = item['mac_address']
    dev_details['user'] = item['agent_logged_on_users']
    dev_details['devName'] = item['resource_name']
    store_list.append(dev_details)

try:
    connection = psycopg2.connect(
        user="",
        other_info="")
#   create cursor to perform db actions
    curs = connection.cursor()
    sql = "INSERT INTO public.tbl_devices (mac, user, devName) VALUES (%(mac)s, %(user)s, %(devName)s);"
    curs.execute(sql, store_list)
    connection.commit()
finally:
    if (connection):
        curs.close()
        connection.close()
        print("Connection terminated")

我最终得到了一个字典作为列表中的记录: [{rec1},{rec2}..etc]

自然而然地将信息放入数据库中,它抱怨“列表索引必须是整数或切片”,因此需要一些关于 A)将其添加到数据库表中的方法或 B)使用不同方法的建议。

在此先感谢

【问题讨论】:

  • 所以我觉得烦人的事情是:1)将记录插入到 postgres 列名似乎必须是小写的,可能看起来像 psycopg2 的东西? 2) 我导入了 pandas 并使用了一个数据框来获取那里的记录。
  • 3) 仍然需要了解有关结构的更多信息,但 JSON 对象可能没有帮助(即为什么将值存储在本身就是字典值的列表中,这是一个子字典.. 等等 让我大吃一惊)现在我已经接近了我需要的地方,关于将字符串值强制为新数据类型的任何想法,即“1571323246400”> 日期?

标签: python json postgresql


【解决方案1】:

你问得好!几乎可以肯定,您应该将 JSON 原样转储到数据库中。这让事情一开始很容易,但是当您稍后尝试查询或修改数据时,您会付出代价。

例如,如果您有类似的数据

[
   { "name": "a", "keys": [1, 2, 3] },
   { "name": "b", "keys": [4, 5, 6] }
]

创建表

CREATE TABLE key_list (
   id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
   name text NOT NULL,
   mytable_id BIGINT REFERENCES mytable NOT NULL
);

CREATE TABLE key (
   id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
   value integer NOT NULL,
   key_list_id bigint REFERENCES key_kist NOT NULL
);

并以这种方式存储值。

【讨论】:

  • 对不起 - 我已经在 pgAdmin 中制作了一个练习表,其中粗略的列试图将其映射到 (tbl_devices) 中,所以就在那里。你的表是一个存储键,一个存储值吗?有趣
  • 不,它应该存储来自该 JSON 的数据,这只是一个示例。我的回答是笼统的,而不是特定于您未知的数据模型。在编写应用程序时,您仍然可以并且应该更改数据模型——毕竟,它应该适合应用程序。当您投入生产时,为时已晚。
  • 谢谢劳伦兹。当我查看其他示例时,它总是一个简单的数组或字典,如果它是基于字符串的数据源,它也很少首先涉及检查。给猫剥皮的方法有很多,但我需要问问有经验的人认为什么是最好的步骤,因为你永远不想在做工作的基础上做事。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多