其实,我的业务流程是, 先读取excel/csv -> pandas 数据清洗 -> 导入Mysql, 一般是做一个表append 或者是 if exist -> replace的操作

逐行来添加数据其实更加灵活和方便.

这里用的驱动是pymysql的一个包, 其实本质就是一个客户端, 服务端已经和mysql进行匹配了, 只是使用client罢了.

还是直接上代码吧, 还是蛮简单的.

 1 #!/usr/bin/env python
 2 # coding: utf-8
 3 # author: [email protected]
 4
 5 '''
 6 应用场景:
 7     将excel等存储的数据 逐条 导入到 Mysql, 即 拼接sql 语句insert into.
 8
 9     特点:
10         1. 更适用于有主键约束的的表, 如花名册管理, 直接将新花名册逐条插入, 如有门店重复,则 替换 掉,保持最新.
11         2. to_sql 则更适用用于无主键约束, 大批量导入数据的场景.
12
13     原理:
14         连接: 用Python提供的pymysql驱动,直接拼接SQL去执行
15         数据: 将每条数据进行"insert into 或 replace into 表名 values (), (), (), ()...每个()放一条数据.
16         过程:
17             1. 创建连接对象 con  名字取通俗易懂哈
18             2. 创建游标对象cursor (通俗理解为连接对象的一个小弟, 用来执行sql, 获取数据..)
19             3. 执行sql语句cursor.execute() 或 executemany()....
20             4. 提交命令(事务) con.commit()
21             5. 查询或提取数据 cursor.fetchall()
22             6. 关闭con, cursor
23
24 '''
25
26 import pandas as pd
27 import pymysql
28
29
30 # 配置
31 主机 = "192.168.6.81"
32 用户 = "xxx"
33 密码 = 123456
34 库名 = "new_house"
35
36
37 # 连接
38
39 # 1. 创建连接对象, 游标对象
40 con = pymysql.connect(主机, 用户, 密码, 库名)
41 cursor = con.cursor()
42
43 def 连接测试(cursor):
44     try:
45         # 3. 连接测试: 执行sql, 提交, 查询
46         cursor.execute("show tables;")
47         # 4. 提交
48         con.commit()
49         # 5. 获取数据
50         print(cursor.fetchall())
51         # 6. 关闭连接
52         cursor.close(); con.close()
53         print("连接测试成功!")
54     except Exception as e:
55         print("连接测试失败!", e)
56
57
58 def 处理数据(path, sheet=None):
59     """"后续可以写更复杂的数据处理逻辑"""
60     table = pd.read_excel(path, sheet)
61     # 将缺失值用 None 填充
62     data = table.where(pd.notnull(table), None)
63     return table
64
65
66 def 导入数据(cursor, table, to_table, method="replace"):
67
68     len_cols = table.columns.size  # 字段的个数
69
70     # 拼接sql语句: => insert into 表名 (字段1, 字段2 ...字段n) values (a,b,c), (d,e,f)....
71     if method not in ("insert", "replace"):
72         print("input error!")
73
74     insert_sql = "%s into %s values (%s)" % (method,to_table, "%s,"*(len_cols-1) + "%s")
75
76     # 变量每行数据, 组成生成器对象  ( (),(),(),(),(),()... ), 每个元组表示一条记录
77     args =  (tuple(row) for _, row in table.iterrows())
78     try:
79         _ = cursor.executemany(insert_sql, args)
80         con.commit()
81         print("successfully!")
82     except Exception as e:
83         print("fail",e)
84     finally:
85         cursor.close()
86         con.close()
87
88
89 if __name__ == '__main__':
90
91     连接测试()
92
93     # table = 处理数据("C:\\Users\\beike\\Desktop\\8月带看明细8.15.xls")
94     #
95     # 导入数据(cursor, table, "数据库有的表", "replace")
01-08 07:01