Я все еще не могу вставить 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
Эта ошибка может быть связана с другими ключами или несуществующими ключами в данных словаря в соответствии с моей более ранней проблемой этой темы ... Мне действительно нужна помощь как до даты ... все еще не в состоянии решить проблему. Пожалуйста, помогите мне. Спасибо.