问题:要从sqlserver同步数据到mongodb

开发环境: python==3.6.5, pandas==0.24.2, macOX, pycharm, pymongo==3.7.1

读取数据库数据到DataFrame的接口

pandas.read_sql(sql, con, index_col=None, coerce_float=True, params=None, parse_dates=None, columns=None, chunksize=None)

  • 读取sql查询结果或者数据表到DataFrame
  • 入参sql:可以是sql查询语句, 也可以是table名字
  • 入参con:SQL可用连接或者数据库URI字符串(DBAPI2连接也支持,比较少见需特别留意接口描述)

读取sqlserver数据库遇到的问题

  1. 时间格式无法存储到mongodb
  2. NaN值无法存储到mongodb

解决办法分别是:

1. 存储到mongodb之前进行时间格式转换(更好的方式是在read_sql入参parse_date进行处理)
2. DataFrame.fillna(value=''),NaN值替换为''空字符串

数据库里有一些列或行全部是NaN,作者使用了如下两行代码进行drop:
DataFrame.dropna(axis=1, how='all', inplace=True)  # axis=columns all NaN, drop it
DataFrame.dropna(axis=0, how='all', inplace=True)  # axis=rows all NaN, drop it

增量同步

DataFrame.tail(1000, inplace=True)  # 取末尾1000条数据
DataFrame_dict = DataFrame.to_dict('records')  # 将DataFrame数据转换为dict,为存储到mongodb作准备
for it in DataFrame_dict:
    collection.replace_one({"id": it['id']}, it, upsert=True)  # 遍历1000条记录插入mongodb, upsert=True是在有相同记录的时候进行替换(避免生成重复记录)

如果有一些统计工作需要完成,那么请探索下 DataFrame,可能会让你事半功倍。