pandasさまざまな列名で動的に作成されるデータフレームがあります。それらをsqlにプッシュしようとしていますが、デフォルトのデータ型 "textとしてmssqlserverに移動したくない"(これがデフォルトである理由を説明できる人はいますか?より一般的なデータ型を使用するのは理にかなっていないでしょうか?)
すべての列にデータ型を指定する方法を知っている人はいますか?
column_errors.to_sql('load_errors',Push_conn, if_exists = 'append', index = False, dtype = #Data type for all columns#)
dtype引数は辞書を使用します。列が何になるかわからないため、すべてを「sqlalchemy.types.NVARCHAR」に設定するのは困難です
これは私がやりたいことです:
column_errors.to_sql('load_errors',Push_conn, if_exists = 'append', index = False, dtype = 'sqlalchemy.types.NVARCHAR')
すべての列タイプを指定する最善の方法についてのヘルプ/理解をいただければ幸いです!
事前に列名がわからない場合は、この辞書を動的に作成できます。
_from sqlalchemy.types import NVARCHAR
df.to_sql(...., dtype={col_name: NVARCHAR for col_name in df})
_
Sqlalchemy型オブジェクト自体(またはNVARCHAR(length=10)
などのパラメーターを指定するインスタンス)とnotを例のように文字列に渡す必要があることに注意してください。
dtype を使用するには、対応する sqlalchemyタイプ を使用して、各データフレーム列にキー設定された辞書を渡します。キーを実際のデータフレーム列名に変更します。
import sqlalchemy
import pandas as pd
...
column_errors.to_sql('load_errors',Push_conn,
if_exists = 'append',
index = False,
dtype={'datefld': sqlalchemy.DateTime(),
'intfld': sqlalchemy.types.INTEGER(),
'strfld': sqlalchemy.types.NVARCHAR(length=255)
'floatfld': sqlalchemy.types.Float(precision=3, asdecimal=True)
'booleanfld': sqlalchemy.types.Boolean})
列名や型が事前にわからない場合は、このdtype
辞書を動的に作成することもできます。
def sqlcol(dfparam):
dtypedict = {}
for i,j in Zip(dfparam.columns, dfparam.dtypes):
if "object" in str(j):
dtypedict.update({i: sqlalchemy.types.NVARCHAR(length=255)})
if "datetime" in str(j):
dtypedict.update({i: sqlalchemy.types.DateTime()})
if "float" in str(j):
dtypedict.update({i: sqlalchemy.types.Float(precision=3, asdecimal=True)})
if "int" in str(j):
dtypedict.update({i: sqlalchemy.types.INT()})
return dtypedict
outputdict = sqlcol(df)
column_errors.to_sql('load_errors',
Push_conn,
if_exists = 'append',
index = False,
dtype = outputdict)