Python操作db2有几种方式:
ibm_db
A)无参数读取、插入、更新
fetch_both只能读取一行,无读取所有行的函数,若要获取所有行数据,需要做循环:
插入、更新类似。
B) 有参数读取、插入、更新
然后再执行:ibm_db.execute(out_stmt)
读取、更新类似
C) 批量插入数据库
从上面可见,插入只能循环一条一条的插入,或者生成csv文件后再导入数据库,速度慢,不灵活。不支持dataframe整体插入数据库中。sqlalchemy和ibm_db_sa
网上大多是mysql的使用方式,对db2基本无资料,只能自己翻了个mysql的源码,发现sqlalchemy也能支持db2,但是需要对包里的几个文件进行修改:
A) 安装好的ibm_db_sa,进行调用时,经常报错:NoSuchModuleError: Can’t load plugin: sqlalchemy.dialects:ibm_db_sa
解决方法:
第一步:这是因为安装的ibm_db_sa默认安装在site-packages的目录下,但是sqlalchemy里面并没有,需要将ibm_db_sa的整个目录拷贝到site-packages\sqlalchemy\dialects下面
第二步:修改site-packages\sqlalchemy\dialects下面的_init_.py,如下:
第三步:修改site-packages\sqlalchemy\databases下面的_init_.py,如下:
B) 以上完成后,就能使用sqlalchemy和ibm_db_sa处理db2了
i) 利用sqlalchemy本身进行查询、插入、更新
获取到的数据是RowProxy类型,无法直接处理,则可以使用下面的方法:
Key和value分别做了dataframe的两列数据,后续可以转置再处理
ii) 利用dataframe进行查询、插入、更新
通过sql读取数据,存储为DataFrame格式
pandas.read_sql_query(sql, con, index_col=None, coerce_float=True, params=None, parse_dates=None,chunksize=None)
read_sql_query()中可以接受SQL语句,包括增删改查。但是DELETE语句不会返回值(但是会在数据库中执行),UPDATE,SELECT,等会返回结果
例如:
data = pd.read_sql_query('select * from t_line ',con = engine)
会返回一个数据库t_line表的DataFrame格式。如有时间列可以parse_dates = [time_column]用于解析时间,并把此列作为索引index_col = [time_column]
整张表读取于DataFrame格式
pandas.read_sql_table(table_name, con, schema=None, index_col=None, coerce_float=True, parse_dates=None, columns=None, chunksize=None)
例如:
data = pd.read_sql_table(table_name = 't_line',con = engine,parse_dates = 'time',index_col = 'time',columns = ['a','b','c'])
读取数据库
pandas.read_sql(sql, con, index_col=None, coerce_float=True, params=None, parse_dates=None, columns=None, chunksize=None)
DataFrame写入数据库
df.to_sql(name = u'tosqltest',con = engine, schema=u'M2_DV',if_exists = 'append',index = False,index_label = False,chunksize = 1000)
schema:用于指定主题;
chunksize:如果data的数据量太大,数据库无法响应可能会报错,这时候就可以设置chunksize,比如chunksize = 1000,data就会一次1000的循环写入数据库。
若报错:“SAWarning: Unicode type received non-unicode bind param value”,则需要在name\schema值的前面加上 ’u’