我想使用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)
有关它的任何想法?
答案 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
值。