Col*_*ien 14 python database executemany pandas
我有一个相当大的pandas dataframe - 50左右标题和几十万行数据 - 我希望使用该ceODBC模块将这些数据传输到数据库.以前我pyodbc在for循环中使用并使用了一个简单的execute语句,但是这个时间非常长(每10分钟1000条记录)......
我现在正在尝试一个新的模块,我正在尝试介绍,executemany()虽然我不太确定参数序列的含义是什么:
cursor.executemany("""insert into table.name(a, b, c, d, e, f)
values(?, ?, ?, ?, ?), sequence_of_parameters)
Run Code Online (Sandbox Code Playgroud)
它应该看起来像一个通过每个标题的常量列表
['asdas', '1', '2014-12-01', 'true', 'asdasd', 'asdas', '2',
'2014-12-02', 'true', 'asfasd', 'asdfs', '3', '2014-12-03', 'false', 'asdasd']
Run Code Online (Sandbox Code Playgroud)
或者需要什么格式?
作为另一个相关的问题,我怎样才能将常规的pandas数据帧转换为这种格式?
谢谢!
小智 18
你可以试试这个:
cursor.executemany(sql_str, your_dataframe.values.tolist())
Run Code Online (Sandbox Code Playgroud)
希望能帮助到你.
我最终设法搞清楚了.因此,如果您有一个Pandas Dataframe,您希望使用ceODBC哪个模块写入我使用的模块,则代码为:
(all_data作为数据框)将数据帧值映射到字符串并将每一行存储为元组列表中的元组
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]
Run Code Online (Sandbox Code Playgroud)
对于元组列表,将所有空值表示符(已在上面的转换中作为字符串捕获)更改为可以传递给结束数据库的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)
Run Code Online (Sandbox Code Playgroud)
创建与数据库的连接
cnxn=ceODBC.connect('DRIVER={SOMEODBCDRIVER};DBCName=XXXXXXXXXXX;UID=XXXXXXX;PWD=XXXXXXX;QUIETMODE=YES;', autocommit=False)
cursor = cnxn.cursor()
Run Code Online (Sandbox Code Playgroud)
定义一个函数,将元组列表转换为元组列表中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)
Run Code Online (Sandbox Code Playgroud)
定义您的查询.
query = """insert into XXXXXXXXXXXX("XXXXXXXXXX", "XXXXXXXXX", "XXXXXXXXXXX") values(?,?,?)"""
Run Code Online (Sandbox Code Playgroud)
运行new_list包含1000个组中的元组列表并执行executemany.通过提交和关闭连接来实现这一点,就是这样:)
for i in range(len(new_list)):
cursor.executemany(query, new_list[i])
cnxn.commit()
cnxn.close()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11156 次 |
| 最近记录: |