将多个csv文件插入已存在的mysql表时出错

时间:2018-06-18 05:47:31

标签: python pandas

我正在尝试使用sqlalchemy将多个csv文件插入到已经存在的名为' Trainstat'使用以下代码:

import os, sys
import pandas as pd
from sqlalchemy import create_engine

engine = create_engine('mysql+mysqldb://si:j9@localhost/db')
path= "/home/sh/T/f/"
dirs = os.listdir( path )
for file in dirs:
    df = pd.read_csv(path+file,sep='\n')
    df.to_sql('Trainstat', con=engine,dtype=None)
    print(df)

但是,我似乎收到错误ValueError: Table 'Trainstat' already exists,当我打开我的表时,它只插入了一行。我的代码可能出现什么错误?除了sqlalchemy之外还有其他方法可以将csv文件插入到现有的表中吗?

2 个答案:

答案 0 :(得分:2)

to_sql方法有一个if_exists参数:

  

if_exists {'fail','replace','append'},默认'失败'

     

如果表已经存在,如何表现。

     
      
  • 失败:提出ValueError。
  •   
  • replace:在插入新值之前删除表。
  •   
  • 追加:将新值插入现有表格。
  •   

另请注意:

  

提升: ValueError

     
    

当表已存在且if_exists为'fail'(默认值)时。

  

由于您没有通过任何内容,因此您获得默认值fail。因此,在为第一个DataFrame创建表后,每个后续DataFrame都会引发ValueError,就像文档说的那样。 ValueError告诉您确切的错误:Table 'Trainstat' already exists

由于您希望附加到表格而不是失败,只需在通话中添加if_exists='append'即可。

答案 1 :(得分:0)

这是因为, to_sql 方法中存在的表的默认参数是失败的。以下对代码的更改应解决您的问题。

import os, sys
import pandas as pd
from sqlalchemy import create_engine

engine = create_engine('mysql+mysqldb://si:j9@localhost/db')
path= "/home/sh/T/f/"
dirs = os.listdir( path )
for file in dirs:
    df = pd.read_csv(path+file,sep='\n')
    df.to_sql('Trainstat', con=engine,dtype=None,if_exists='append')
    print(df)