Невозможно загрузить pandas кадр данных со столбцом JSON в базу данных mysql - PullRequest
0 голосов
/ 17 февраля 2020

У меня есть pandas фрейм данных, который выглядит следующим образом, когда я распечатываю его в терминале в pycharm. Это внутри django проекта

`     exception              recommendation    time_dimension_id
0  {'exception': []}               0                217
1  {'exception': []}               0                218
2  {'exception': []}               0                219
3  {'exception': []}             546                220
4  {'exception': []}            2876                221
5  {'exception': []}            7855                222
6  {'exception': [{'error...  , 5041                223
7  {'exception': []}              57                224
8  {'exception': []}               0                225
9  {'exception': []}               0                226
10 {'exception': []}               0                227
11 {'exception': []}             108                228
12 {'exception': []}               0                229
13 {'exception': []}              12                230
14 {'exception': []}               0                231
15 {'exception': []}               0                232
16 {'exception': []}               0                233
17 {'exception': []}               0                234
18 {'exception': []}               0                235
19 {'exception': []}               0                236
20 {'exception': []}               0                237
21 {'exception': []}               0                238
22 {'exception': []}               0                239
23 {'exception': []}               0                240
`

Я попытался вставить этот фрейм данных в таблицу, используя приведенный ниже код.

connection = engine.connect()
    df.to_sql('table_name', con=connection, if_exists='append', index=False)

Затем я получил ошибку ниже

graphql.error.located_error.GraphQLLocatedError: (MySQLdb._exceptions.OperationalError) (3140, 'Invalid JSON text: "Отсутствует имя для элемента объекта." В позиции 1 в значении для столбца \' fact_exception .exception \ '.') [SQL: 'INSERT INTO fact_exception (исключение, рекомендация, time_dimension_id) VALUES (% s,% s,% s)'] [параметры: (({'исключение': []}, 0, 217), ({'исключение': []}, 0, 218), ({'исключение': []}, 0, 219), ({'исключение': []}, 546, 220), ({'исключение': []}, 2876, 221), ({'исключение': []}, 7855, 222), ({'исключение': [{'error': '', 'fatal': ' com.materiall.recommender.cache.MetaLU: 58 - Невозможно загрузить metaLU для express_com-u1456154309768com.materiall.conn ... (усечено 6923 символа) ... "resource.type": "index_or_alias", "resource.id": "нуль", "index_uuid": " на ", "индекс": "нулевой"}, "стат us ": 404} \ n ',' time_stamp ':' 2020-02-11T06: 26: 23,694 '}]}, 5041, 223), ({' исключение ': []}, 57, 224) ... отображение 10 из 24 наборов связанных параметров ... ({'exception': []}, 0, 239), ({'exception': []}, 0, 240))] (Справочная информация об этой ошибке в: http://sqlalche.me/e/e3q8)

Ниже соответствующего кода, используемого для создания кадра данных по столбцам

        fact_excep["exception"] = excep_df_column #this is a list of dictionaries
        fact_excep["recommendation"] = recommendation_col #this is a list integers
        fact_excep["time_dimension_id"] = time_dimension_id_col #this is a list integers
        # print(fact_excep)
    connection = engine.connect()
    fact_excep.to_sql("fact_exception", con=connection, if_exists="append", index=False)
    response = "fact_exception data created"
    return response

Ниже приведена модель

class FactException (models.Model):    #this is the model
fact_exception_id = models.AutoField(primary_key=True)
time_dimension_id = models.ForeignKey(
    TimeDimension, null=False, blank=True, db_column="time_dimension_id", on_delete=models.CASCADE)
recommendation = models.IntegerField()
exception = JSONField(null=True, blank=True)

objects = models.Manager()

class Meta:
    db_table = 'fact_exception'

def __int__(self):
    return self.fact_exception_id

Любая помощь будет оценена.

1 Ответ

1 голос
/ 17 февраля 2020

Ваш столбец не содержит действительных JSON:

{'exception': [{'error': '', 'fatal': 'com.materiall.recommender.cache.MetaLU:58 - Cannot Load metaLU for express_com-u1456154309768com.materiall.conn...'}]}
# and
{'exception': []}

недопустимо, поскольку ключи и строки имеют одинарные кавычки, что недопустимо в JSON. Вы должны использовать двойные кавычки, и весь столбец должен быть строками:

'{"exception": [{"error": "", "fatal": "com.materiall.recommender.cache.MetaLU:58 - Cannot Load metaLU for express_com-u1456154309768com.materiall.conn..."}]}'
# and
'{"exception": []}'

Вы устанавливаете столбец, используя список python символов, но, поскольку вы используете df.to_sql() для сохранения, для этого требуется ваш фрейм данных, чтобы иметь точные данные, требуемые запросом SQL. Если бы вы использовали свою модель, вы могли бы просто присвоить my_factexception.exception = some_dict, и она сохранится как JSON. Но вы, по сути, обходите Django ORM, который знает вашу модель и знает, как сопоставить словарь с полем jsonb, поэтому вы должны сделать это самостоятельно.

Поэтому, когда вы устанавливаете значения для вашего столбец исключения, используйте json.dumps(some_dict) для создания json строк.

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