使用 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 值。