您的位置:首页 > 编程语言 > Python开发

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()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python mysql