在MySQL数据库中通过SQLAlchemy编写Pandas Dataframe

时间:2016-12-15 12:42:31

标签: python mysql pandas dataframe sqlalchemy

我正在尝试使用pandas将pandas数据帧写入mysql数据库。这对我来说非常适合

  

to_sql

但我想要的是使用sqlalchemy在我自己的表测试中写日期,自动收报机和adj_close。不知何故,我尝试过这样做,但它无法正常工作。使用以下内容:

ins = test.insert()

ins = test.insert().values(date=DataLevels['Date'], ticker=DataLevels['ticker'], adj_close=DataLevels['adj_close'])
ins.compile().params
mysql_engine.execute(ins)

使用它我收到以下错误消息:

  

(mysql.connector.errors.ProgrammingError)处理失败   pyformat参数; Python'系列'无法转换为MySQL   type [SQL:'INSERT INTO test(date,ticker,adj_close)VALUES   (%(日期)s,%(股票代码)s,%(adj_close)s)'] [参数:{'ticker':0
  AAPL

有人知道这是如何起作用的吗?代码低于上面提到的代码部分:

import sqlalchemy as sqlal
import pandas_datareader.data as pdr
import pandas as pd

mysql_engine = sqlal.create_engine('mysql+mysqlconnector://xxx')
mysql_engine.raw_connection()

metadata = sqlal.MetaData()

test = sqlal.Table('test', metadata,
                                sqlal.Column('date', sqlal.DateTime, nullable=True),
                                sqlal.Column('ticker', sqlal.String(10), sqlal.ForeignKey("product.ticker"), nullable=True), 
                                sqlal.Column('adj_close', sqlal.Float, nullable=True),
                                ) 

metadata.create_all(mysql_engine) 

DataLevels = pdr.DataReader(['ACN','AAPL','^GDAXI'], 'yahoo', '2016-11-19', '2016-12-1')
DataLevels = pd.melt(DataLevels['Adj Close'].reset_index(), id_vars='Date', value_name='adj_close', var_name='minor').rename(columns={'minor': 'ticker'})

1 个答案:

答案 0 :(得分:1)

要在单个INSERT中插入多行,请不要为每列传递Series,传递记录列表。

test.insert().values(DataLevels[['Date', 'ticker', 'adj_close']].to_dict('records'))