私は最終的にこれを理解することができました。したがって、私が使用したモジュールを使用してデータベースに書き込みたい 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]
タプルのリストについては、上記の変換で文字列としてキャプチャされたすべての 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()
タプルのリストを に変換する関数を定義します。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()