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 привело к значению вне допустимого диапазона
Как исправить эту проблему?