【发布时间】:2020-03-24 17:49:17
【问题描述】:
我仍然无法将 mydata 插入 sql。我有搜索但找不到解决方案。我读取了 json 文件并将数据插入到 sql db 中。 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 | |
+---------------------------+--------------+------+-----+---------+----------------+
并非所有字典都列出了所有 db 参数。有些没有“州”和“城市”,有些字典没有“附加备注”..有些有“临时员工ID”和“临时员工名称”。总体而言,db中的参数将涵盖需要插入的json文件的不同类型的key/value数据。
下面是需要插入到 db table1 的示例数据
{
"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"
},
}
}
我正在使用下面的脚本插入数据...我插入了 table1 中可用的所有键..但我得到了错误
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 文件中的字典键集不相同并且有些不存在...所以,我该如何进行数据插入...例如,如果没有州或城市或附加备注只插入 null。当某些关键参数与其他关键参数不同或不存在时,我不确定该怎么做。我希望你们能帮助并建议我解决方案。谢谢
我已经尝试了 mr rashid 解决方案并在下面返回错误
<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
这个错误可能是由于字典数据中的不同键或不存在键,根据我之前的这个线程的问题...... 到目前为止,我真的需要帮助......仍然无法解决问题。请帮我。谢谢。
【问题讨论】:
-
您需要将dict的键和对应的值添加到每个json条目的sql中,而不是硬编码一段sql。
标签: python mysql json dictionary sql-insert