将json数据插入sql,所有字典中的键都不相同,并且某些键不存在

问题描述 投票:0回答:1

我仍然无法将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    |                |
+---------------------------+--------------+------+-----+---------+----------------+

并非所有字典都列出了所有的数据库参数。有些没有“州”和“城市”,有些字典没有“ additional_remarks”。有些则没有“ temp_staff_id”和“ temp_staff_name”。总体而言,数据库中的参数将覆盖需要插入的json文件的键/值数据的不同类型。

下面是需要插入数据库表1的示例数据


         {
          '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'
         }

我正在使用下面的脚本插入数据...我插入了table1中所有可用的键..但出现错误

#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 ...

如果每个字典的所有键都相同并且存在并且遵循与db参数完全相同的方式,那么我可以插入数据而没有任何错误。

由于json文件中的字典键集不相同,并且其中一些不存在...因此,我该如何进行数据插入..例如,如果没有州,城市或Additional_remarks仅插入null。当某些关键参数不存在时,我不确定该怎么做。我希望你们能帮助和进一步建议我。谢谢

python mysql json dictionary sql-insert
1个回答
0
投票

因此,与其对sql进行硬编码以使其具有每一列,不如对其进行硬编码。您需要动态构建sql语句,以具有所需的列/值。

这可以通过一个简单的循环来完成。

© www.soinside.com 2019 - 2024. All rights reserved.