<p>我终于弄明白了。
因此,如果您有一个Pandas数据帧,希望使用<code>ceODBC</code>(我使用的模块)将其写入数据库,那么代码是:</p>
<p>(使用<code>all_data</code>作为数据帧)将数据帧值映射到字符串,并将每一行作为元组存储在元组列表中</p>
<pre><code>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]
</code></pre>
<p>对于元组列表,将所有空值指示符(在上面的转换中被捕获为字符串)更改为可以传递到最终数据库的空类型。这是我的问题,可能不是你的问题。</p>
<pre><code>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)
</code></pre>
<p>创建到数据库的连接</p>
<pre><code>cnxn=ceODBC.connect('DRIVER={SOMEODBCDRIVER};DBCName=XXXXXXXXXXX;UID=XXXXXXX;PWD=XXXXXXX;QUIETMODE=YES;', autocommit=False)
cursor = cnxn.cursor()
</code></pre>
<p>定义一个函数,将元组列表转换为<code>new_list</code>,这是对元组列表的进一步索引,将其转换为1000个块。这对于我将数据传递到SQL查询不能超过1MB的数据库是必要的。</p>
<pre><code>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)
</code></pre>
<p>定义查询。</p>
<pre><code>query = """insert into XXXXXXXXXXXX("XXXXXXXXXX", "XXXXXXXXX", "XXXXXXXXXXX") values(?,?,?)"""
</code></pre>
<p>运行包含1000组元组列表的<code>new_list</code>,并执行<code>executemany</code>。接下来提交并关闭连接,就这样:)</p>
<pre><code>for i in range(len(new_list)):
cursor.executemany(query, new_list[i])
cnxn.commit()
cnxn.close()
</code></pre>