#python #sql-server #pandas
#питон #sql-сервер #панды
Вопрос:
Скорее теоретический вопрос относительно наилучшего способа настройки чего-либо.
У меня довольно большой pandas
фрейм данных (примерно 330 столбцов), и я надеюсь перенести его в таблицу на SQL Server.
Мой текущий процесс состоял в том, чтобы экспортировать фрейм данных как a .csv
, а затем использовать Import Flat File
функцию для создания таблицы, а затем в будущем у меня будет настройка прямого подключения в Python для взаимодействия. Для фреймов данных меньшего размера это работало нормально, поскольку было проще изменить типы столбцов данных и в конечном итоге заставить его работать.
При выполнении этого на больших фреймах данных моя проблема в том, что я часто получаю следующее сообщение:
НАЗВАНИЕ: Microsoft SQL Server Management Studio
Ошибка при вставке данных в таблицу. (Microsoft.SQLServer.Import.Wizard)
Заданное значение типа String из источника данных не может быть преобразовано в тип nvarchar указанного целевого столбца. (System.Data)
Строковые или двоичные данные будут усечены. (System.Data)
Это не дает мне конкретного столбца относительно того, что вызывает проблему, так есть ли какой-нибудь способ более эффективно получать эти данные, а не просматривать каждый столбец вручную?
Любая помощь будет оценена! Спасибо
Комментарии:
1. Вы пробовали
sqlalchemy
?2. спасибо — cna вы создаете новую таблицу в SQL из
sqlalchemy
?
Ответ №1:
Согласно вашему запросу, на самом деле это проблема, когда вы пытаетесь записать строковое значение в столбец, превышается ограничение по размеру. Вы можете либо увеличить ограничение на размер столбца, либо попробовать усечение перед вставкой. Допустим, столбец A
в df
имеет тип varchar(500)
, попробуйте выполнить следующее перед вставкой :-
df.A=df.A.apply(lambda x: str(x)[:500])
Ниже приведена альтернатива sqlalchemy для вставки.
connect_str="mssql pyodbc://<username>:<password>@<dsnname>"
Для создания соединения —
engine = create_engine(connect_str)
Создайте таблицу —
from sqlalchemy import Table, MetaData, Column, Integer
m = MetaData()
t = Table('example', m,
Column('column_1', Integer),
Column('column_2', Integer)),
...)
m.create_all(engine)
После создания выполните следующие действия :-
df.to_sql('example', if_exists='append')
Комментарии:
1. Спасибо, я попробую. Нужно ли вручную добавлять имена столбцов? их 300, так что это то, чего я пытаюсь избежать
2. Я предпочитаю сначала создавать таблицу вручную, а затем вставлять записи, однако
sqlalchemy
позволяет вставлять и без создания таблицы.3. Спасибо Anant. Моя проблема в том, что существует 300 столбцов, поэтому я стараюсь избегать добавления их вручную (без ошибок типа данных).
4. Вы можете задать тип данных столбца перед вставкой. Предположим, что существует меньшее количество строковых столбцов, тогда вы можете попытаться сначала привести его,
df.A=df.A.astype(str)
а затем вставить.