Pandas to_sql все столбцы как nvarchar

У меня есть фреймворк pandas, который динамически создается с именами столбцов, которые меняются. Я пытаюсь подтолкнуть их к sql, но не хочу, чтобы они переходили в mssqlserver как "тип текста" по умолчанию (может ли кто-нибудь объяснить, почему это значение по умолчанию? Не имеет смысла использовать более распространенный тип данных? )

Кто-нибудь знает, как я могу указать тип данных для всех столбцов?

column_errors.to_sql('load_errors',push_conn, if_exists = 'append', index = False, dtype = #Data type for all columns#)

аргумент dtype принимает dict, и, поскольку я не знаю, какими будут столбцы, трудно установить их все как "sqlalchemy.types.NVARCHAR"

Это то, что я хотел бы сделать:

column_errors.to_sql('load_errors',push_conn, if_exists = 'append', index = False, dtype = 'sqlalchemy.types.NVARCHAR')

Любая помощь/понимание того, как лучше всего указывать все типы столбцов, было бы очень полезно!

Ответ 1

Вы можете создать этот диктовки динамически, если вы заранее не знаете имена столбцов:

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

Обратите внимание, что вам нужно передать сам объект типа sqlalchemy (или экземпляр для указания таких параметров, как NVARCHAR(length=10)), а не строку, как в вашем примере.

Ответ 2

Чтобы использовать 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)

Ответ 3

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)

Я попробовал этот метод, но я получаю эту ошибку для datetime :.

Преобразование типа данных nvarchar в тип данных datetime привело к значению вне допустимого диапазона

Как исправить эту проблему?