使用 Flask-Sqlalchemy 将缺少密钥的 json 导入 postgres
Import json with missing keys into postgres with Flask-Sqlalchemy
我有一个问题你们也许可以回答。
我有一个 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!!!")
我不知道为什么,但不知为何每个单元格都是 NULL,除了 official_id
字段。怎么会这样,我该如何解决?我现在已经无计可施了。非常感谢您的指点或帮助。
编辑:
到目前为止,我发现 entry.key
没有被解释为 entry.state
,而是实际上创建了一个引用 entry.key = "BW"
。这是为什么?
你的问题是
entry.key = value
您只是将您的值一遍又一遍地写入 School
模型中的属性 'key'。我真的很惊讶 SQLAlchemy 没有在这里引发某种错误......
只需将所有值传递到构造函数中,就可以了:
school["id"] = school.pop("official_id")
entry = School(**school)
编辑:它是“BW”,因为这恰好是写入属性的最后一个值。
您可以通过 executing 此本机参数化查询将 JSON 文件的文本内容作为参数传递 jsontext
:
insert into school
select * from jsonb_populate_recordset(null::school, :jsontext::jsonb);
我有一个问题你们也许可以回答。
我有一个 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!!!")
我不知道为什么,但不知为何每个单元格都是 NULL,除了 official_id
字段。怎么会这样,我该如何解决?我现在已经无计可施了。非常感谢您的指点或帮助。
编辑:
到目前为止,我发现 entry.key
没有被解释为 entry.state
,而是实际上创建了一个引用 entry.key = "BW"
。这是为什么?
你的问题是
entry.key = value
您只是将您的值一遍又一遍地写入 School
模型中的属性 'key'。我真的很惊讶 SQLAlchemy 没有在这里引发某种错误......
只需将所有值传递到构造函数中,就可以了:
school["id"] = school.pop("official_id")
entry = School(**school)
编辑:它是“BW”,因为这恰好是写入属性的最后一个值。
您可以通过 executing 此本机参数化查询将 JSON 文件的文本内容作为参数传递 jsontext
:
insert into school
select * from jsonb_populate_recordset(null::school, :jsontext::jsonb);