将嵌套的 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
以及可能需要显式转换的日期字段。
就是这样。我希望我能帮上一点忙。
我想将数据从 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
以及可能需要显式转换的日期字段。
就是这样。我希望我能帮上一点忙。