Python连接ODBC数据及sql与Dataframe转换

1.python连接odbc数据库代码
import pyodbc
con = pyodbc.connect(“DSN = 需要连接的数据库名”,autocommit = True)
cursor = con.cursor()
sql = “select * from app”
cursor.execute(sql)
cursor.fetchone() #显示查询sql的第一行
cursor.fetchmany(3)#显示查询的前三行
cursor.fetchall()#显示查询所有

2.数据库表与Dataframe转换
import pyodbc
import pandas as pd
con = pyodbc.connect(“DSN = 需要连接的数据库名”,autocommit = True)
sql = “select * from app”
data = pd.read_sql(sql=sql,con=con,coerce_float=True) #把查询的sql转换为Dataframe数据表类型
参数意义:
sql:SQL命令字符串
con:连接sql数据库的engine,一般可以用SQLalchemy或者pymysql之类的包建立(此处用pyodbc)
index_col: 选择某一列作为index
coerce_float:非常有用,将数字形式的字符串直接以float型读入
parse_dates:将某一列日期型字符串转换为datetime型数据,与pd.to_datetime函数功能类似。可以直接提供需要转换的列名以默认的日期形式转换,也可以用字典的格式提供列名和转换的日期格式,比如{column_name: format string}(format string:"%Y:%m:%H:%M:%S")。
columns:要选取的列。一般没啥用,因为在sql命令里面一般就指定要选择的列了
chunksize:如果提供了一个整数值,那么就会返回一个generator,每次输出的行数就是提供的值的大小。

处理好数据new_data(Dataframe类型)后要存入数据库
from sqlalchemy.types import NVARCHAR,INTEGER,DateTime
new_data.to_sql(name=“table_a”,con=con)
参数意义:
name: 输出的表名
con: 与read_sql中相同,数据库链接
if_exits: 三个模式:fail,若表存在,则不输出;replace:若表存在,覆盖原来表里的数据;append:若表存在,将数据写到原表的后面。默认为fail
index:是否将df的index单独写到一列中
index_label:指定列作为df的index输出,此时index为True
chunksize: 同read_sql
dtype: 指定列的输出到数据库中的数据类型。字典形式储存:{column_name: sql_dtype}。常见的数据类型有sqlalchemy.types.INTEGER(), sqlalchemy.types.NVARCHAR(),sqlalchemy.Datetime()等

今天再次遇到这个问题,google了一下,在stackoverflow上面找到了答案.可以通过指定chunksize参数的方式来进行大批量插入,pandas会自动将数据拆分成chunksize大小的数据块进行批量插入,其实原理类似于我在上面使用的循环插入法.在不指定这个参数的时候,pandas会一次性插入dataframe中的所有记录,mysql如果服务器不能响应这么大数据量的插入,就会出现上述错误.附上正确的插入姿势:

pd.io.sql.to_sql(df,‘xxx’,zh_con,flavor=‘mysql’,if_exists=‘append’,index=False,chunksize=10000)
#此处的chunksize可以自定义
附连接impala的代码
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值