我的理解是你可以从数据库(在这种情况下是MySQL)中提取数据,将这些数据加载到pandas df来操作它(添加新列,在SQL中不容易完成的复杂计算等)然后加载新数据列回到MySQL。但是,我在将最新创建的列添加回MySQL中的同一个现有表中的最后一步时遇到了问题。我找到的唯一类似问题是here,但我遗漏了一个关键组件。
我正在使用pandas to_sql
来执行此任务(有更好的选择吗?)。我的代码从我的MySQL表中提取加密数据,将其加载到pandas df中,我添加了一个新的volatile列(我知道你可以在SQL中计算这个,这只是一个例子)。
SQL表(加密)
date open_price close_price high_price low_price market_cap volume
1 2018-03-11 8852.78 9578.63 9711.89 8607.12 149,716,000,000 6,296,370,000
2 2018-03-10 9350.59 8866.00 9531.32 8828.47 158,119,000,000 5,386,320,000
3 2018-03-09 9414.69 9337.55 9466.35 8513.03 159,185,000,000 8,704,190,000
4 2018-03-08 9951.44 9395.01 10147.40 9335.87 168,241,000,000 7,186,090,000
pandas df
date open_price close_price high_price low_price market_cap volume Volatility
1 2018-03-11 8852.78 9578.63 9711.89 8607.12 149,716,000,000 6,296,370,000 .2
2 2018-03-10 9350.59 8866.00 9531.32 8828.47 158,119,000,000 5,386,320,000 .58
3 2018-03-09 9414.69 9337.55 9466.35 8513.03 159,185,000,000 8,704,190,000 .56
4 2018-03-08 9951.44 9395.01 10147.40 9335.87 168,241,000,000 7,186,090,000 .12
我首先进入MySQL并添加了一个新列:
ALTER TABLE `crypto`
ADD COLUMN Volatility float NOT NULL;
以下代码是我以前首先将数据推送到MySQL的代码。我将if_exists
更改为append
但我收到了错误消息
df.to_sql(name='crypto', con=engine, if_exists = 'append', chunksize=10000)
DatabaseError: (mysql.connector.errors.DatabaseError) 1364 (HY000): Field 'Volitility_90' doesn't have a default value
如何在MySQL表中添加1个新列?我是否需要使用其他包并使用cursor.execute()
。任何有关此代码的帮助,或一些在线教程都会有所帮助!我似乎无法在这个具体的例子中找到很多内容,这让我第二次完全猜测整个数据操作策略。
答案 0 :(得分:0)
由于表中已有行,因此SQL无法知道要在现有行的新列中填充哪些值。
创建新列时需要说明默认值。
请在此处查看如何执行此操作: Adding a new SQL column with a default value