将嵌套的 Json 插入 MySQL table

Insert a nested Json into MySQL table

我想将数据从 Amazon 托管的 DocumentDb 移动到 MySQL table(避免重复插入,所以我使用 'INSERT IGNORE INTO')。 DocumentDb 中的数据如下所示:

   [{
    "_id": {
        "$oid": "5f0e2c96eebd1c040a42523c"
    },
    "packNumber": 324,
    "DMMMeasuredCurrent": 1.75,
    "BMUReportedCurrent": 1.76,
    "error": 0.5,
    "operator": "Abc",
    "notes": "na",
    "reworks": [],
    "createdAt": {
        "$date": 1594764438975
    },
    "updatedAt": {
        "$date": 1594764438975
    },
    "__v": 0
}, , {
    "_id": {
        "$oid": "5f7b390701476b835e4379dd"
    },
    "packNumber": 420,
    "DMMMeasuredCurrent": 1.75,
    "BMUReportedCurrent": 1.74,
    "error": 0.5,
    "operator": "xyz",
    "notes": "l",
    "reworks": [],
    "createdAt": {
        "$date": 1601911047462
    },
    "updatedAt": {
        "$date": 1601911047462
    },
    "__v": 0
}]

我在 MySql 中创建了 Table,如下所示: 创建 table 辅助电流 1

(
BMUReportedCurrent varchar(50),
DMMMeasuredCurrent varchar(50),
notes   varchar(500),
packNumber  varchar(50),
__v varchar(50),
createdAt   varchar(50),
updatedAt   varchar(50),
operator    varchar(50),
idno    varchar(50),
reworks varchar(50)
)

如何将从 DocumentDb 获取的数据插入到 MySQL table?下面的代码,片段是我到目前为止尝试过的,但它没有在 MySQL table.

中插入数据
    import pymongo
    import sys
    from bson.json_util import dumps, loads
    from bson import json_util
    import mysql.connector
    from mysql.connector import connection
    #import MySQLdb
    import json
    from pandas.io import sql
    from sqlalchemy import create_engine
    import pandas as pd
    from pandas.io.json import json_normalize
    
    client = pymongo.MongoClient('mongodb://user:passwrd@host:27017/?ssl=**=.pemFile
    print('DocumentDb connected')
    
    
    #Create MySQL Connection
    mysqlConnection = mysql.connector.connect(host='host',database='db', user='user', password='passwrd',port=3306)
    mysqlCursor = mysqlConnection.cursor()
    print('MySQL Connection Established')
    
    
    #Specify the database to be used
    db = client.everestdocumentdb
    col=db.auxcurrents.find()
    print('The next line will print col')
    print(json_util.dumps(col))
    
    
    #Insert Into MySQL
    rows = ("INSERT IGNORE INTO table1 VALUES(%s)")
    mysqlCursor.executemany(rows,test)
    mysqlConnection.commit()

    print('Ran the db.execute command')

非常感谢任何帮助。提前致谢。

这里更明显的问题是你没有在行 mysqlCursor.executemany(rows, test)

之前的任何地方设置 test

但要记住 MySql 与 MongoDB 不同,它是一个关系数据库,因此您不能只在其上插入 JSON。您不能像 INSERT INTO myTable VALUES (myJson) 那样期望每个 JSON 字段将填充 table.

中的正确列

做你想做的事,首先,你需要把你的JSON转换成一个字典列表,然后再把它转换成一个列表列表。类似的东西:

import json

with open("a.json") as data:
    dictionary = json.load(myJsonString)

rows = []
for field in dictionary:
    rows.append((
        field["_id"]["$oid"],
        field["packNumber"],
        field["DMMMeasuredCurrent"],
        #...other columns
        field["__v"]
    ))

print(rows)

现在您可以使用

sql = ("INSERT IGNORE INTO table1 VALUES(%s, %s, %s,...)")
mysqlCursor.executemany(sql,rows)

(注意每列需要一个 %s

除此之外,您需要保证 field 顺序与数据库的列顺序匹配,或者(IMO 更好的选择)在 INSERT:

中显式声明列名
INSERT INTO table Col1, Col2, Col3,...,ColN VALUES (%s, %s, %s,...,%s)")

最后,您可能需要在将列表转换为字符串后处理字段 reworks 以及可能需要显式转换的日期字段。

就是这样。我希望我能帮上一点忙。