【问题标题】:Import json with missing keys into postgres with Flask-Sqlalchemy使用 Flask-Sqlalchemy 将缺少键的 json 导入 postgres
【发布时间】:2022-01-17 07:04:45
【问题描述】:

我有一个问题你们也许可以回答。

我有一个看起来像这样的 json 文件:

[
{
        "address": "some address",
        "full_time_school": false,
        "name": "some name",
        "official_id": "722154",
        "school_type": "Grundschule",
        "school_type_entity": "Grundschule",
        "state": "BW"
    },
    {
        "address": "some other address",
        "name": "some other name",
        "official_id": "722190",
        "state": "BW"
    }
]

关键是不是每个条目都有所有键。

我有一个如下所示的 flask-sqlalchemy 模型:

class School(db.Model):

    __tablename__ = "school"  # pragma: no cover

    address = db.Column(db.String)
    full_time_school = db.Column(db.Boolean)
    name = db.Column(db.String)
    official_id = db.Column(db.Integer)
    school_type = db.Column(db.String)
    school_type_entity = db.Column(db.String)
    state = db.Column(db.String)

    def __repr__(self):
        return f"<name {self.name}"

我有一个 python 脚本可以将 json 条目添加到我的 postgresql 数据库中,如下所示:

from my_project import db
from my_project.models import School

import json
import os

# insert data
for filename in os.listdir("datamining"):
    if filename.endswith(".json"):

        file = open(os.path.join("datamining", filename))

        print(f"Add schools from {filename.strip('.json')}")

        data = json.load(file)

        cleaned_data = {school["official_id"]: school for school in data}.values()
        print(f"Adding {len(data)} schools to the database.")

        for school in cleaned_data:
            entry = School(
                    id=school["official_id"]
                )
            for key, value in school.items():
                entry.key = value
            
            db.session.add(entry)
            db.session.commit()
        file.close()

print("Added all schools!!!")

我不知道为什么,但不知何故,除了 official_id 字段之外,每个单元格都是 NULL。怎么样,我该如何解决?我现在已经走投无路了。非常感谢每一个指针或帮助。

编辑: 到目前为止,我发现entry.key 不会被解释为entry.state,但实际上会创建一个引用entry.key = "BW"。这是为什么呢?

【问题讨论】:

    标签: python json python-3.x postgresql flask-sqlalchemy


    【解决方案1】:

    你的问题是

    entry.key = value
    

    您只是在School 模型中的“键”属性中一遍又一遍地写入您的值。我实际上很惊讶 SQLAlchemy 没有在这里引发某种错误...... 只需将所有值传递给构造函数就可以了:

    school["id"] = school.pop("official_id")
    entry = School(**school)
    

    编辑:它是“BW”,因为这恰好是写入属性的最后一个值。

    【讨论】:

    • 我刚刚意识到official_id 是您数据库中的一个字段。我不熟悉 Flask-SQLAlchemy 以及如何传递 id。我可以想象“id”实际上是由数据库设置的,并在刷新时在会话中更新。然后你可以省略我开学的那一行[official_id]。
    【解决方案2】:

    您可以通过executing 这个本机参数化查询将 JSON 文件的文本内容作为参数 jsontext 传递,从而更轻松、更快速地完成此操作:

    insert into school 
     select * from jsonb_populate_recordset(null::school, :jsontext::jsonb);
    

    【讨论】:

    • 谢谢!我采用了上述解决方案,但下次我必须导入 json 数据时,我会尝试您的解决方案 :)
    猜你喜欢
    • 1970-01-01
    • 2018-09-28
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 2021-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多