web-dev-qa-db-ja.com

pandas to_sqlすべての列をnvarcharとして

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')

すべての列タイプを指定する最善の方法についてのヘルプ/理解をいただければ幸いです!

13
flyingmeatball

事前に列名がわからない場合は、この辞書を動的に作成できます。

_from sqlalchemy.types import NVARCHAR
df.to_sql(...., dtype={col_name: NVARCHAR for col_name in df})
_

Sqlalchemy型オブジェクト自体(またはNVARCHAR(length=10)などのパラメーターを指定するインスタンス)とnotを例のように文字列に渡す必要があることに注意してください。

23
joris

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)
21
Parfait