将Python数据框插入MySQL

时间:2019-03-07 16:49:57

标签: python mysql pandas

我试图从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)

1 个答案:

答案 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