У меня 74 относительно больших Pandas DataFrames (около 34 600 строк и 8 столбцов), которые я пытаюсь как можно быстрее вставить в базу данных SQL Server. Проведя некоторые исследования, я узнал, что хорошая функция ole pandas.to_sql
не подходит для таких больших вставок в базу данных SQL Server, которая была первоначальным подходом, который я принял (очень медленно - почти час для приложения, чтобы завершить vs около 4 минут . при использовании базы данных MySQL)Записывать большие базы данных Pandas в базу данных SQL Server
This article, и многие других сообщений StackOverflow были полезны, указывая мне в правильном направлении, однако я ударил контрольно-пропускной пункт:
Я пытаюсь использовать Ядро SQLAlchemy, а не ORM по причинам, указанным в ссылке выше. Итак, я преобразование dataframe в словарь, используя pandas.to_dict
и затем делать в execute()
и insert()
:
self._session_factory.engine.execute(
TimeSeriesResultValues.__table__.insert(),
data)
# 'data' is a list of dictionaries.
Проблема заключается в том, что вставка не получает каких-либо значений - они появляются в кучу пустых скобок и I получить эту ошибку:
(pyodbc.IntegretyError) ('23000', "[23000] [FreeTDS][SQL Server]Cannot
insert the value NULL into the column...
Есть значения в списке словарей, которые я прошел в, так что я не могу понять, почему значения не отображаются.
EDIT:
Вот пример, который я иду прочь:
def test_sqlalchemy_core(n=100000):
init_sqlalchemy()
t0 = time.time()
engine.execute(
Customer.__table__.insert(),
[{"name": 'NAME ' + str(i)} for i in range(n)]
)
print("SQLAlchemy Core: Total time for " + str(n) +
" records " + str(time.time() - t0) + " secs")
* около 4 минут при использовании базы данных MySQL * ... так 'to_sql()' является жизнеспособным решением только соединение медленнее в MSSQL по сравнению с MySQL? Какой API ODBC вы используете? Является ли сервер базы данных локальным или удаленным? Рассмотрим импорт таблицы temp, а затем перейдите в итоговую таблицу. – Parfait
@Parfait: Использование '' 'to_sql()' '' дает приемлемую производительность с MySQL, но не MSSQL. Я использую pyobbc. База данных удалена, поэтому запись в CSV-файлы и последующее выполнение объемной вставки через raw sql-код не будут работать в этой ситуации. Кроме того, пользователям нужны дополнительные права администрирования, что не всегда возможно для пользователей этого приложения. – denvaar
Рассмотрите обход драйвера odbc и используйте строго API Python - [pmyssl] (http://www.pymssql.org/en/latest/) И API ODBC MySQL? pymysql? Такая же структура таблицы и типы данных в обоих? Такое же количество записей? Действительно исследуйте это. Оба являются высокоуровневыми корпоративными RDMS и не должны выполнять этот широкий диапазон (4 минуты против ~ 60 минут). – Parfait