我最终弄清楚了这一点。因此,如果您有一个Pandas Dataframe想要写入数据库(
ceODBC我使用的模块),则代码为:
(with
all_dataas the dataframe)将dataframe值映射到字符串,并将每一行作为一个元组存储在元组列表中
for r in all_data.columns.values: all_data[r] = all_data[r].map(str) all_data[r] = all_data[r].map(str.strip) tuples = [tuple(x) for x in all_data.values]
对于元组列表,将所有null值指示符(已在上面的转换中作为字符串捕获)更改为可以传递给最终数据库的null类型。这对我来说是个问题,可能不适合您。
string_list = ['NaT', 'nan', 'NaN', 'None']def remove_wrong_nulls(x): for r in range(len(x)): for i,e in enumerate(tuples): for j,k in enumerate(e): if k == x[r]: temp=list(tuples[i]) temp[j]=None tuples[i]=tuple(temp)remove_wrong_nulls(string_list)
创建与数据库的连接
cnxn=ceODBC.connect('DRIVER={SOMEODBCDRIVER};DBCName=XXXXXXXXXXX;UID=XXXXXXX;PWD=XXXXXXX;QUIETMODE=YES;', autocommit=False)cursor = cnxn.cursor()
定义一个将元组列表转换为a的函数,
new_list这是对元组列表的进一步索引,转换为1000个块。这对于将数据传递到SQL查询不能超过1MB的数据库是必要的。
def chunks(l, n): n = max(1, n) return [l[i:i + n] for i in range(0, len(l), n)]new_list = chunks(tuples, 1000)
定义您的查询。
query = """insert into XXXXXXXXXXXX("XXXXXXXXXX", "XXXXXXXXX", "XXXXXXXXXXX") values(?,?,?)"""
遍历
new_list包含每组1000个的元组列表并执行
executemany。通过提交并关闭连接来完成此 *** 作,仅此而已:)
for i in range(len(new_list)): cursor.executemany(query, new_list[i])cnxn.commit()cnxn.close()
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)