使用 Python 将数据帧插入 MS-SQL 时出错
error when inserting dataframe into MS-SQL with Python
我想使用 pypyodbc 将 pandas 数据帧插入到 MS-SQL 中。
这是我的代码:
首先创建一个数据框:
df = pd.DataFrame({'C1': [11, 21, 31],
'C2': [12, 22, 32],
'C3': [13, 23, 33]})
tablename = tb
然后将dataframe插入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()
此代码导致错误消息显示 "type object is not subscriptable"。
但是,如果我使用
一切都会正确
data1 = [(11,12,13),(22,23,24),(32,33,34)]
将 executemany(sql, data)
中的数据替换为 executemany(sql, data1)
有什么想法吗?
df.values
是一个 <class 'numpy.ndarray'>
,当你做
data = [tuple(x) for x in df.values]
您将获得包含类型 <class 'numpy.int64'>
元素的元组列表。 pypyodbc 期望元组包含 "normal" Python 类型,因此您需要使用
data = [tuple(int(col) for col in row) for row in df.values]
将数字转换为普通的旧 int
值。
我想使用 pypyodbc 将 pandas 数据帧插入到 MS-SQL 中。 这是我的代码:
首先创建一个数据框:
df = pd.DataFrame({'C1': [11, 21, 31],
'C2': [12, 22, 32],
'C3': [13, 23, 33]})
tablename = tb
然后将dataframe插入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()
此代码导致错误消息显示 "type object is not subscriptable"。
但是,如果我使用
一切都会正确data1 = [(11,12,13),(22,23,24),(32,33,34)]
将 executemany(sql, data)
中的数据替换为 executemany(sql, data1)
有什么想法吗?
df.values
是一个 <class 'numpy.ndarray'>
,当你做
data = [tuple(x) for x in df.values]
您将获得包含类型 <class 'numpy.int64'>
元素的元组列表。 pypyodbc 期望元组包含 "normal" Python 类型,因此您需要使用
data = [tuple(int(col) for col in row) for row in df.values]
将数字转换为普通的旧 int
值。