python访问MySQL
2016-06-28 09:37
489 查看
MySQL针对python3.5的包oracle没有开发,但是有pymysql,同样能解决大部分的问题。因为用到的问题主要就是查询,插入,执行语句。
1.连接mysql
import pymysql # 注意,最好指定字符集编码,不然可能会遇到乱码问题,charset="utf8" conn = pymysql.connect(host=host, port=port, user=user, passwd=passwd, db=db, charset="utf8") # oracle对应的,字符集的设置是 os.environ['NLS_LANG']='SIMPLIFIED CHINESE_CHINA.UTF8' # 或者 os.environ['NLS_LANG']='SIMPLIFIED CHINESE_CHINA.ZHS16GBK'
2.查询数据
查询数据可以用fetchall()函数,不过我习惯用pandas的read_sql,直接转成DataFrame,方便后续分析import pymysql import pandas as pd conn = pymysql.connect(host=host, port=port, user=user, passwd=passwd, db=db, charset="utf8") sql="select * from test" data = pd.read_sql(sql,conn)
3.执行sql语句
比如执行存储过程,或者更新表的操作。import pymysql conn = pymysql.connect(host=host, port=port, user=user, passwd=passwd, db=db, charset="utf8") cursor = conn.cursor() # 执行存储过程 sql="call proc_name('id','name') " curosr.execute(sql) curosr.execute('commit')
4.导入数据
导入数据使用executemany函数。首先将DataFrame转成字符串格式,将原来是空值的替换为None,不能是空字符串,入库,MySQL会自动将数据转换成数值型或者日期型等。
import pymysql conn = pymysql.connect(host=host, port=port, user=user, passwd=passwd, db=db, charset="utf8") cursor = conn.cursor() # 将DataFrame转成字符型:1 def data_to_str(string): if not string: # 如果是空字符串 return None else: return str(string) # 将DataFrame转成字符型:2 df2 = df.applymap(data_to_str) # 将DataFrame转成list-tuple格式,才能导入数据库 param = [] if len(df2)>1: for i in range(len(df2)): param.append(tuple(df2.iloc[i])) # 转成list_tuple格式 if len(df2)==1: param = [tuple(df2.iloc[0])] # 创建入库的sql,格式是 insert into tb_name(col1,col2,col3.....) values (%s,%s,%s....) sql = "insert into tb_name (cols) values (s_many_times) " cols = list(df2.columns) # 获取字段名 cols_string = ', '.join(cols) # 拼接字段名 val = len(list(df2.columns)) # 查看字段个数 val = ['%s' for i in range(val)] val_string = ','.join(val) # 拼接成多个 %s 的拼接字符串 sql = sql.replace('tb_name',tb_name) sql = sql.replace('cols',cols_string) sql = sql.replace('s_many_times',val_string ) # 入库 cursor.executemany(sql, param) # 提交 conn.commit() cursor.close() conn.close()
5.对比oracle的入库
oracle中,如果是空值,则使用空字符串入库,此外,如果是日期字段,则需要将日期字符串转成datetime格式才能入库。import cx_Oracle import pandas as pd conn = cx_Oracle.connect("hr/abc123@127.0.0.1/orcl") # 如果编码错误,需设置NLS_LANG环境变量 os.environ['NLS_LANG']='SIMPLIFIED CHINESE_CHINA.UTF8' # 将DataFrame转成字符型:1 def data_to_str(string): if not string: # 如果是空字符串 return '' # 如果是空,则转成空字符串 else: return str(string) # 将DataFrame转成字符型:2 df2 = df.applymap(data_to_str) # 处理日期字段 df2['time'] = df2['time'].apply(lambda s:pd.to_datetime(s)) df2['loaddate'] = df2['loaddate'].apply(lambda s:pd.to_datetime(s)) # 创建导数的SQL sql="insert into table_name ( columns ) values(:ints)" cols = list(df2.columns) columns = ','.join(cols) numstr = [str(i) for i in range(1,len(cols)+1)] ints = ":" + ',:'.join(numstr) # 得到':1,:2,:3,:4,:5,:6,:7'的字符串 sql = sql.replace('table_name', table) sql = sql.replace('columns', columns) sql = sql.replace(':ints', ints) # 将df转成list-tuple格式,才能导入数据库 param = [] if len(df2)>1: for i in range(len(df2)): param.append(tuple(df2.iloc[i])) # 转成list_tuple格式 if len(df2)==1: param = [tuple(df2.iloc[0])] # 入库 cursor.prepare(sql) cursor.executemany(None, param) conn.commit()
相关文章推荐
- MySQL中的integer 数据类型
- MySQL存储过程
- Python动态类型的学习---引用的理解
- Python3写爬虫(四)多线程实现数据爬取
- 垃圾邮件过滤器 python简单实现
- 下载并遍历 names.txt 文件,输出长度最长的回文人名。
- mysql中int、bigint、smallint 和 tinyint的区别与长度
- mysql load data 导出、导入 csv
- install and upgrade scrapy
- source命令执行SQL脚本文件
- Scrapy的架构介绍
- Centos6 编译安装Python
- 使用Python生成Excel格式的图片
- 让Python文件也可以当bat文件运行
- [Python]推算数独
- MySQL创建用户及权限控制
- MySQL管理数据表