Вставьте данные json в sql, ключи не совпадают во всех словарях, а некоторые ключи не существуют - PullRequest
0 голосов
/ 24 марта 2020

Я все еще не могу вставить mydata в sql. У меня есть поиск, но я не могу найти решение. Я читаю файл json и вставляю данные в sql дБ. Файл json содержит список из нескольких словарей ключ / значение. Ниже приведен столбец параметров, сконфигурированный для таблицы БД1

+---------------------------+--------------+------+-----+---------+----------------+
| Field                     | Type         | Null | Key | Default | Extra          |
+---------------------------+--------------+------+-----+---------+----------------+
| id                        | int(10)      | NO   | PRI | NULL    | auto_increment |
| log_number                | int(10)      | YES  |     | NULL    |                |
| timestamp                 | datetime     | YES  |     | NULL    |                |
| staff_id                  | varchar(10)  | YES  |     | NULL    |                |
| staff_name                | varchar(30)  | YES  |     | NULL    |                |
| temp_staff_id             | varchar(10)  | YES  |     | NULL    |                |
| temp_staff_name           | varchar(30)  | YES  |     | NULL    |                |
| staff_department          | varchar(20)  | YES  |     | NULL    |                |
| service_id                | varchar(20)  | YES  |     | NULL    |                |
| service_number            | varchar(20)  | YES  |     | NULL    |                |
| state                     | varchar(20)  | YES  |     | NULL    |                |
| city                      | varchar(20)  | YES  |     | NULL    |                |
| description               | varchar(50)  | YES  |     | NULL    |                |
| additional_remarks        | varchar(100) | YES  |     | NULL    |                |
+---------------------------+--------------+------+-----+---------+----------------+

Не во всех словарях перечислены все параметры БД. У некоторых нет 'state' и 'city', а в некоторых словарях нет 'extra_remarks' .. у некоторых есть 'temp_staff_id' и 'temp_staff_name'. В целом параметры в БД будут охватывать различные типы данных ключ / значение файла json, которые необходимо вставить.

Ниже приведены примеры данных, которые необходимо вставить в таблицу БД1

{
  "response": {
   "client_log": {
      "data": [
          {
          "log_number": "1",
          "timestamp": "2020-01-11 04:23:31",
          "staff_id": "A123",
          "staff_name": "Krill",
          "staff_department": "Sales",
          "service_id": "11111",
          "service_number": "BU-11111",
          "description": "This is description1"
         },
         {
          "log_number": "2",
          "timestamp": "2020-01-11 07:03:39",
          "staff_id": "A456",
          "staff_name": "James",
          "staff_department": "Graphic",
          "service_id": "22222",
          "service_number": "XU-22211",
          "State": "AAA",
          "City": "AAA"
         },
         {
          "log_number": "3",
          "timestamp": "2020-01-27 14:29:11",
          "temp_staff_id": "A571",
          "temp_staff_name": "Mary",
          "staff_department": "Engr",
          "service_id": "89000",
          "service_number": "SP-89001",
          "State": "BBB",
          "City": "BBB"
         },
         {
          "log_number": "4",
          "timestamp": "2020-01-27 15:08:20",
          "staff_id": "A765",
          "staff_name": "Alex",
          "staff_department": "Sales",
          "service_id": "09880",
          "service_number": "XU-09880",
          "description": "This is description3333"
         }
      ],
      "query": "4"
    },
  }
}


Я использую приведенный ниже скрипт для вставки данных ... Я вставляю все ключи, доступные в таблице1 ... но я получил ошибку

with open(myfile, 'r') as f:
   mydata = json.load(f)

#Insert the values onto table1 of db.
sql = "INSERT INTO `table1` (`log_number`, `timestamp`, `staff_id`, `staff_name`, `temp_staff_id`, `temp_staff_name`, `staff_department`, `service_id`, `service_number`, `state`, `city`, `description`, `additional_remarks`) VALUES ( %(log_number)s, %(timestamp)s, %(staff_id)s, %(staff_name)s, %(temp_staff_id)s, %(temp_staff_name)s, %(staff_department)s, %(service_id)s, %(service_number)s, %(state)s, %(city)s, %(description)s, %(additional_remarks)s )"
cursor.executemany( sql, mydata['response']['client_log']['data'])

Ошибка ...

1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '%(temp_staff_id)s, %(temp_staff_name)s, 'Sales', '11111', 'BU-11111', %(state)s,' at line 1

Если все ключи каждого словаря одинаковы и существуют и следуют точно так же, как параметры БД, я могу вставлять данные без ошибок.

Как набор ключей словаря в json файл не такой же, а некоторые не существует ... так, как я могу сделать вставку данных .. например, если ни штат, ни город, ни дополнительные_марки просто вставляют ноль. Я не уверен, как это сделать, когда некоторые из ключевых параметров не совпадают с другими или не существуют. Я надеюсь, что вы, ребята, можете помочь и посоветовать мне решение. Спасибо



Я попытался г-н Рашида решение и ошибка возврата ниже

<class 'dict'> ====> mydata is a dictionary type
{'response': {'client_log': {'data': [{'log_number': '1', 'timestamp': '2020-01-11 04:23:31', 'staff_id': 'A123', 'staff_name': 'Krill', 'staff_department': 'Sales', 'service_id': '11111', 'service_number': 'BU-11111', 'description': 'This is description1'}, {'log_number': '2', 'timestamp': '2020-01-11 07:03:39', 'staff_id': 'A456', 'staff_name': 'James', 'staff_department': 'Graphic', 'service_id': '22222', 'service_number': 'XU-22211', 'State': 'AAA', 'City': 'AAA'}, {'log_number': '3', 'timestamp': '2020-01-27 14:29:11', 'temp_staff_id': 'A571', 'temp_staff_name': 'Mary', 'staff_department': 'Engr', 'service_id': '89000', 'service_number': 'SP-89001', 'State': 'BBB', 'City': 'BBB'}, {'log_number': '4', 'timestamp': '2020-01-27 15:08:20', 'staff_id': 'A765', 'staff_name': 'Alex', 'staff_department': 'Sales', 'service_id': '09880', 'service_number': 'XU-09880', 'description': 'This is description3333'}], 'total_hero_query': '13'}, 'response_time': '0.723494', 'transaction_id': '909122', 'transaction_status': 'OK', 'transaction_time': 'Fri Feb 28 15:27:51 2020'}}
'str' object has no attribute 'keys'

Я редактирую ниже

for row in json_in['response']['client_log']['data']: 

Ошибка, связанная с ключ пропал, но теперь ошибка, связанная с sql

1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'description1, 2020-01-11 04:23:31, Krill, Sales, BU-11111, 1, 11111),(A123, This' at line 1 

Эта ошибка может быть связана с другими ключами или несуществующими ключами в данных словаря в соответствии с моей более ранней проблемой этой темы ... Мне действительно нужна помощь как до даты ... все еще не в состоянии решить проблему. Пожалуйста, помогите мне. Спасибо.

1 Ответ

0 голосов
/ 24 марта 2020

Так что вместо жесткого кодирования sql нужно иметь каждый столбец. Вам необходимо динамически построить операторы sql, чтобы иметь те столбцы / значения, которые у вас есть.

Это можно сделать с помощью простого l oop.

Также вместо немедленного выполнения команда вставки. Я поместил их в список, чтобы вы могли одновременно загружать все загрузки. Я не написал часть кода, так что вам нужно будет это сделать. 2-й l oop необходимо будет заменить на код потока, или, если вы не собираетесь выполнять поток, вы можете просто выполнить выполнение вместо добавления его в переменную sql_inserts.

Редактировать: Добавлено Json Загрузка.

Так что я точно не знаю, как ваши данные попадают в код. Но необработанные данные json отображаются в виде строки Unicode. Вы должны отформатировать его в словарь. К счастью, есть удобный модуль python, который делает это.

Так что мы можем просто импортировать модуль json и затем загрузить в него данные.

Также обратите внимание, что у меня был ошибка копирования и вставки с именем переменной.

Убедитесь, что любой код, который говорит keys, теперь говорит sql_keys

import json

# This converts the json data into a python dictionary so that python can process it.
json_in = json.loads(mydata)

sql_template = 'INSERT INTO `table1` ({}) VALUES ({})'
sql_inserts = []

for row in json_in:
    sql_keys = row.keys()
    sql_values = []

    for key in sql_keys:
        sql_values.append(row[key])

    # This is the line my copy and paste error was on
    sql_inserts.append(sql_template.format(', '.join(sql_keys), ', '.join(sql_values)))

for insert in sql_inserts:
    cursor.executemany(insert, mydata['response']['client_log']['data'])

Это очень чистый и простой для чтения способ сделать это. Если вы действительно заботитесь о том, сколько строк кода, как в ситуации с гольф-кодом, вы можете сделать этот сортировщик, выполнив понимание списка и / или, возможно, лямбду.

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