将Python数据帧插入MySQL

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

我试图从API调用数据作为原始jsons,规范化它们,然后将它们发送到MySQL中的表。但是在将值放入INSERT语句时遇到格式问题。反正有没有将所有内容转换为单个字符串然后将其作为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)这样的东西,我得到的东西看起来非常接近我想要的东西:

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值。

我可以通过正则表达式来解决这个问题,以便格式化我接受它,但我觉得必须有更好的方法将一行数据传递给MySQL或事件整个数据帧。

编辑: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)
python mysql pandas
1个回答
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

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