pymysql 将数据导入至数据库

 1 import pandas as pd
 2 import pymysql
 3 
 4 
 5 # 参数设置 DictCursor使输出为字典模式 连接到本地用户ffzs 密码为666
 6 config = dict(host='localhost', user='xxx', password='xxxx', cursorclass=pymysql.cursors.DictCursor)
 7 
 8 # 建立连接
 9 conn = pymysql.Connect(**config)
10 # 自动确认commit True
11 conn.autocommit(1)
12 # 设置光标
13 cursor = conn.cursor()
14 
15 # pandas读取文件 这里随便找了一个爬取的股票文件改的名字
16 # usecols 就是说我只用这些列其他列不需要
17 # parse_dates 由于csv只储存str、int、float格式无法储存日期格式,所以读取是设定吧日期列读作时间格式
18 df = pd.read_csv('D:\Downloads\股票参数\沪深300.csv', encoding='gbk', usecols=[0, 3, 4, 5, 6, 9, 11], parse_dates=['date'] )
19 
20 print(df.head(10))
21 
22 # 一个根据pandas自动识别type来设定table的type
23 def make_table_sql(df):
24     columns = df.columns.tolist()
25     types = df.ftypes
26     # 添加id 制动递增主键模式
27     make_table = []
28     for item in columns:
29         if 'int' in types[item]:
30             char = item + ' INT'
31         elif 'float' in types[item]:
32             char = item + ' FLOAT'
33         elif 'object' in types[item]:
34             char = item + ' VARCHAR(255)'
35         elif 'datetime' in types[item]:
36             char = item + ' DATETIME'
37         make_table.append(char)
38     return ','.join(make_table)
39 
40 
41 # csv 格式输入 mysql 中
42 def csv2mysql(db_name , table_name, df):
43     # 创建database
44     cursor.execute('CREATE DATABASE IF NOT EXISTS {}'.format(db_name))
45     # 选择连接database
46     conn.select_db(db_name)
47     # 创建table
48     cursor.execute('DROP TABLE IF EXISTS {}'.format(table_name))
49     cursor.execute('CREATE TABLE {}({})'.format(table_name,make_table_sql(df)))
50     # 提取数据转list 这里有与pandas时间模式无法写入因此换成str 此时mysql上格式已经设置完成
51     df['date'] = df['date'].astype('str')
52     values = df.values.tolist()
53     # print(values)
54     # 根据columns个数
55     s = ','.join(['%s' for _ in range(len(df.columns))])
56     # print(s)
57     # executemany批量操作 插入数据 批量操作比逐个操作速度快很多
58     cursor.executemany('INSERT INTO {} VALUES ({})'.format(table_name,s), values)
59 
60 
61 csv2mysql(db_name="stock_analyze", table_name="hs300" , df=df)
62 
63 cursor.execute('SELECT * FROM hs300 LIMIT 5')
64 # scroll(self, value, mode='relative') 移动指针到某一行; 如果mode='relative',则表示从当前所在行移动value条,如果 mode='absolute',则表示从结果集的第一行移动value条.
65 cursor.scroll(4)
66 cursor.fetchall()
67 conn.close()

refer from: https://blog.csdn.net/tonydz0523/article/details/82529941

 

posted @ 2020-03-14 15:12  Ian_learning  阅读(1537)  评论(0编辑  收藏  举报