我试图从API调用数据作为原始json,对其进行规范化,然后将其发送到MySQL中的表中。但是在将值放入我的INSERT语句时遇到格式问题。无论如何,没有将所有内容都转换为单个String然后将其作为SQL命令传递,是否可以做到这一点?
#Getting Data
conn = http.client.HTTPSConnection("api.address.com")
conn.request("GET", url, headers=datheaders)
eventres = conn.getresponse()
eventjson = json.loads(eventres.read().decode("utf-8"))
eventtable = json_normalize(eventjson)
这时我有一个很大的DataFrame,假设我已经在MySQL中创建了表,然后我想将我要上传的数据上传到它。
conn = pymysql.connect(host='testrds.value.com',
user='val',
passwd='######',
db='Data')
cursor = conn.cursor()
这是我在将值格式化为SQL INSERT语句时遇到的问题。
front = "INSERT INTO `tablename` (`client_version` text, `device_surrogate` text, `envelope_id` text, `envelope_timestamp` text, `geohash` text, `location_method` text, `location_precision` text, `received_timestamp` text, `schema_version` double DEFAULT NULL, `timestamp` text) VALUES ("
back = " )"
for row in eventtable.iterrows():
sql = front + str(row.values) + back
cursor.execute(sql)
我正在遍历数据框,并希望使用每一行的值来连接在一起的SQL语句,如果我尝试使用诸如print(row.values)之类的方法,则会得到与我想要的东西非常接近的东西: / p>
In: print(row.values)
Out: ['7.6.0.62' 'cellularphone.YN_7FZ0nUrqbHW--YylTnJH67qvJ-i6gLgTIljnFnRA=' 'fc76a4bd-1ad9-11e9-a705-3b719d243433' '2019-01-18T04:31:54.334+0000' 'com.tmobile.pr.analyticssdk' '1.0.52' 'mockCamp' '0cfe18e0-7bf8-4340-b8ed-4c768ec48cbd' nan 0.0 '89da2c58-6ac7-46ff-a3e8-124914c8e53b' '5fc3d106-e412-4826-818c-95ad40414e5a']
我将需要添加逗号并除去括号,但是不幸的是,当我实际尝试将row.values评估为字符串时,它也带有一堆\ n值。
我很可能可以使用正则表达式来格式化所需的格式,以便SQL能够接受它,但是我觉得必须有一种更好的方法将一行数据传递给MySQL或事件整个数据帧。 / p>
编辑: to_sql()绝对是我要找的答案,但是连接仍然是一个问题,对于有类似问题的任何人,我都能获得以下解决方案。
database_username = 'Name'
database_password = '#####'
database_ip = 'host'
database_name = 'Data'
database_connection = sqlalchemy.create_engine('mysql+mysqlconnector://{0}:{1}@{2}/{3}'.
format(database_username, database_password,
database_ip, database_name), pool_recycle=1, pool_timeout=57600).connect()
eventtable.to_sql(con=database_connection, name=eventtype, if_exists='append',chunksize=100)
答案 0 :(得分:4)
您可能不需要遍历DataFrame,只需使用to_sql
方法:
import sqlalchemy as sa
e = sa.create_engine(...)
df.to_sql("table_name", e, if_exists="replace", index=False)
以下是MySQL的示例:Writing to MySQL database with pandas using SQLAlchemy, to_sql