1.通过tuple()把dataframe的列转化为元组,然后就可以配合sql语句的 ’in‘ 使用了,不过如果df为空时,sql会报错,提前len()判断一下规避即可。
2.从数据库里找每条基金的最小净值日期作为成立日期:select fund_id, min(statistic_date) statistic_date from fund_nv_data_standard group by fund_id
这种写法速度很快,而且节省内存。不然的话只能将基金的全部净值日期取出再判断,每条基金的最小净值日期,这样太麻烦了,所以sql里直接这样使用比较方便。
if __name__ == '__main__':
sql="""SELECT fund_id from fund_info where foundation_date is null or foundation_date=''"""
df=pd.read_sql(sql,engine_2g_base())
if not df.empty:
fund_id=tuple(df['fund_id'])
if len(fund_id)==1:
sql_date="""select fund_id, min(statistic_date) as foundation_date from fund_nv_data_standard where fund_id='{}'""".format(fund_id[0])
df_date=pd.read_sql(sql_date,engine_2g_base())
else:
sql_date = """select fund_id, min(statistic_date) as foundation_date from fund_nv_data_standard where fund_id in {} group by fund_id""".format(
fund_id)
df_date = pd.read_sql(sql_date, engine_2g_base())
print(df_date.tail(1))
to_sql('fund_info',engine_2g_base(),df_date)
else:
print('fund_info表没有基金foundation_date为空')