Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何解析JSON数据并将其保存到postgresql表中?_Python_Json_Python 3.x_Postgresql - Fatal编程技术网

Python 如何解析JSON数据并将其保存到postgresql表中?

Python 如何解析JSON数据并将其保存到postgresql表中?,python,json,python-3.x,postgresql,Python,Json,Python 3.x,Postgresql,我的目录中有一个python文件和多个JSON文件(大约20个文件)。我还定义了一个postgresql模式。如何解析json文件并将值存储在Postgresql表中? 这是我的schema.sql文件 CREATE TABLE IF NOT EXISTS node_data_table ( id AUTOINCREMENT, block_producer_key VARCHAR, recieved_at timestamp, online_status BOOL

我的目录中有一个python文件和多个JSON文件(大约20个文件)。我还定义了一个postgresql模式。如何解析json文件并将值存储在Postgresql表中? 这是我的schema.sql文件

CREATE TABLE IF NOT EXISTS node_data_table (
    id AUTOINCREMENT,
    block_producer_key VARCHAR,
    recieved_at timestamp,
    online_status BOOLEAN DEFAULT TRUE,
    added_time timestamp,
    PRIMARY KEY(block_producer_key, recieved_at)

);
这是我的python文件

import json
import glob
from sqlalchemy import create_engine

db_name = 'playground'
db_user = 'postgres'
db_pass = 'username@1'
db_host = 'db'
db_port = '5432'

db_string = 'postgres://{}:{}@{}:{}/{}'.format(db_user, db_pass, db_host, db_port, db_name)
db = create_engine(db_string)
for filename in glob.glob("2021-03-05.*.json"):
    with open(filename) as json_data:
        data = json.load(json_data)
        columns = list(data.keys())
        print('Column names', columns)
输出:

Column names ['receivedAt', 'receivedFrom', 'blockProducerKey']

我在这里要做的是得到一个列名列表。我希望这些列名下的值存储在postgresql数据库中。我该怎么做?我知道需要使用
json.dumps
转储它,但是如何与postgresql数据库交互?请帮忙

好的,您已经有了sqlachemy引擎。您可以使用连接插入数据:

db = create_engine(db_string)
conn = db.connect()
with conn.begin():                             # use a single transaction
    for filename in glob.glob("2021-03-05.*.json"):
        with open(filename) as json_data:
            data = json.load(json_data)
            conn.execute("""INSERT INTO node_data_table (block_producer_key,recieved_at)
                            VALUES(:block_producer_key, :recieved_at)""",
                         {k, v for k,v in data.items() if k in ('block_producer_key',
                                                                'recieved_at')})

您好,感谢您的快速响应,但是数据中的{k,v代表k,v存在语法错误。如果k in('block_producer_key',@technophile_3:我忘记了
items
…修复后的parens。但运行时它崩溃到[SQL:INSERT into node_data_table(block_producer_key,received_at))值中(:block_producer_key,:received_at)](此错误的背景位于:)不幸的是,我手边没有PostgreSQL数据库。我只模拟了一个具有不同语义的SQLite数据库。在再次阅读声明后,我认为收到的_at值应该转换为datetime对象。我做了一些更改,我能够做到。非常感谢