Как вставить Dataframe Pandas в таблицу синонимов SQL Server - PullRequest
0 голосов
/ 08 мая 2019

Сводка

В SQL Server синонимы часто используются для абстрагирования удаленной таблицы в текущий контекст базы данных.Обычные операции DML прекрасно работают с такой конструкцией, но SQL Server отслеживает синонимы как их собственный тип объекта отдельно от таблиц.

Я пытаюсь использовать метод pandas DataFrame#to_sqlчтобы упростить загрузку синонима, и, хотя он хорошо работает, когда таблица является локальной для базы данных, он не может найти таблицу через синоним и вместо этого пытается создать новую таблицу, координирующуюся со структурой DataFrame, что приводит к конфликту имен объектовнежелательное поведениезатем запрашивает INFORMATION_SCHEMA.columns представление как способ проверить, существует ли таблица.

К сожалению, таблицы синонимов не отображаются в INFORMATION_SCHEMA представлениях, подобных этому.В ответе на вопрос «Как найти все имена столбцов синонима» ответчик предоставляет метод для установки столбцов синонимов, который может быть применим здесь.

Вопрос

Существует ли какой-либо метод, который может необязательно пропускать проверки существования таблицы во время DataFrame#to_sql?Если нет, есть ли способ заставить панд или алхимию SQL распознать синоним?Я не мог найти подобные вопросы по SO, и ни у git не было проблемы, похожей на эту.

1 Ответ

0 голосов
/ 08 мая 2019

Я принял свой собственный ответ, но если у кого-то есть лучший способ загрузки DataFrames в синонимы SQL Server, пожалуйста, опубликуйте его!

Алхимия SQL на SQL Server в настоящее время не поддерживает таблицы синонимов, что означает, что метод DataFrame#to_sql не может быть вставлен в них, и необходимо использовать другой метод.

Начиная с SQL Alchemy 1.2, диалект Oracle поддерживает Синоним / DBLINK Reflection , но аналогичная функция недоступна для SQL Server, даже в готовящемся выпуске SQL Alchemy 1.4 .


Для тех, кто пытается решить эту проблему по-разному, если ваша ситуация соответствует следующим критериям:

  • Ваш целевой синоним уже объявлен в ORM как таблица
  • Имена столбцов таблицы соответствуют именам столбцов в DataFrame
  • Типы данных столбца таблицы либо соответствуют DataFrame, либо могут быть преобразованы без ошибок

Вы можете выполнить следующую операцию bulk_insert_mappings, при этом TargetTable определит вашу цель в модели ORM и df определит ваш DataFrame:

db.session.bulk_insert_mappings(
        TargetTable, df.to_dict('records')
)

В качестве бонуса, это значительно быстрее, чем операция DataFrame#to_sql!

...