使用Python将数据帧插入MS-SQL时出错

时间:2017-09-07 07:26:00

标签: python sql-server pandas dataframe pypyodbc

我想使用pypyodbc将pandas数据帧插入到MS-SQL中。 这是我的代码:

首先创建一个数据框:

df = pd.DataFrame({'C1': [11, 21, 31],
                    'C2': [12, 22, 32],
                    'C3': [13, 23, 33]})
tablename = tb

然后将数据帧插入MS-SQL

def insertDFtoSQL(df,tablename):
    con = ppo.connect(r'Driver={SQL Server};
                     'r'Server=se;'
                      r'Database=db;'
                      r'Trusted_Connection=yes;')
    cols = ','.join([k for k in df.dtypes.index])
    params = ','.join('?' * len(df.columns))
    sql = 'INSERT INTO {0} ({1}) VALUES ({2})'.format(tablename, cols, params)
    data = [tuple(x) for x in df.values]
    con.cursor().executemany(sql, data)
    con.commit()
    con.close()

此代码导致出现错误消息,表示"类型对象不可订阅"。

但是,如果我使用

,一切都会正确
data1 = [(11,12,13),(22,23,24),(32,33,34)]

executemany(sql, data)中的数据替换为executemany(sql, data1)

有关它的任何想法?

1 个答案:

答案 0 :(得分:3)

df.values<class 'numpy.ndarray'>,当你做

data = [tuple(x) for x in df.values]

您将获得包含<class 'numpy.int64'>类型元素的元组列表。 pypyodbc期望元组包含“普通”Python类型,所以你需要使用

data = [tuple(int(col) for col in row) for row in df.values]

将数字转换为普通的旧int值。