Какое правильное определение модели peewee при отображении из файла json? - PullRequest
0 голосов
/ 05 августа 2020

Привет, сообщество переполнения стека! Это мой первый вопрос, но я заранее пытался найти ответ. Прямо сейчас я работаю над загрузкой данных из json файла , например, (на самом деле у меня есть файл json с именем persons.json, а не API) с использованием peewee в SQLite DB. Как видите, файл json имеет несколько вложенных dicts. Моя модель peewee выглядит следующим образом:

import json
import sqlite3
from peewee import *

db = SqliteDatabase('persons.sqlite3')

class Person(Model):
    gender = CharField()
    name = CharField()
    location = CharField()
    email = CharField()
    login = CharField()
    dob = CharField()
    registered = CharField()
    phone = CharField()
    cell = CharField()
    id_ = CharField()
    picture = CharField()
    nat = CharField()
    count_dob = IntegerField()

И вот как я загружаю все данные из json файла в базу данных SQLite:

db.connect()

db.create_tables([Person])

with open('persons.json', encoding='utf8') as persons:
    persons_data = json.load(persons)


for person in persons_data['results']:
    p = Person(gender=person['gender'], name=person['name'], location=person['location'], email=person['email'], 
                login=person['login'], dob=person['dob'], registered=person['registered'], phone=person['phone'],
                cell=person['cell'], id_=person['id'], picture=person['picture'], nat=person['nat'])

Мой вопрос: делать вы думаете, что переменные в моей модели определены правильно (в основном каждая из них как CharField)? Дело в том, что позже, когда я запрашиваю БД, и мне нужно получить доступ к некоторым из этих вложенных словарей, они на самом деле являются строкой, которую я могу преобразовать с использованием ast.literal_eval обратно в dict, но я не думаю, что это выглядит отлично. Я подумал о решении - для всех переменных типа словаря в моей модели ('location', 'dob' et c) вместо использования CharField() я, вероятно, мог бы использовать JSONField() - не знаю, как это сделать что хотя. Не могли бы вы посоветовать по этому поводу?

1 Ответ

0 голосов
/ 05 августа 2020

Реляционные базы данных не поддерживают «вложение». Это фундаментально. Все, что вложено, вероятно, должно быть в отдельной таблице или в отдельном столбце как плоское / скалярное значение.

https://en.wikipedia.org/wiki/Database_normalization

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...