У меня есть фреймворк pandas, который я пытаюсь вставить в MS SQL EXPRESS, как показано ниже:

import pandas as pd
import sqlalchemy

engine = sqlalchemy.create_engine("mssql+pyodbc://user:password@testodbc")
connection = engine.connect()

data = {'Host': ['HOST1','HOST2','HOST3','HOST4'],
    'Product': ['Apache HTTP 2.2','RedHat 6.9','OpenShift 2','JRE 1.3'],
    'ITBS': ['Infrastructure','Accounting','Operations','Accounting'],
    'Remediation': ['Upgrade','No plan','Decommission','Decommission'],
    'TargetDate': ['2018-12-31','NULL','2019-03-31','2019-06-30']}

df = pd.DataFrame(data)

Когда я звоню:

df.to_sql(name='TLMPlans', con=connection, index=False, if_exists='replace')

А потом:

print(engine.execute("SELECT * FROM TLMPLans").fetchall())

Я хорошо вижу данные, но на самом деле никаких транзакций не происходит:

D:\APPS\Python\python.exe 
C:/APPS/DashProjects/dbConnectors/venv/Scripts/readDataFromExcel.py
[('HOST1', 'Apache HTTP 2.2', 'Infrastructure', 'Upgrade', '2018-12-31'), ('HOST2', 'RedHat 6.9', 'Accounting', 'No plan', 'NULL'), ('HOST3', 'OpenShift 2', 'Operations', 'Decommission', '2019-03-31'), ('HOST4', 'JRE 1.3', 'Accounting', 'Decommission', '2019-06-30')]

Process finished with exit code 0

enter image description here

Здесь говорится, что мне не нужно фиксировать, как это делает SQLAlchemy:

Требуется ли для функции Pandas DataFrame.to_sql () последующий commit ()?

И следующие предложения не работают:

Панды to_sql не вставляет никаких данных в мою таблицу

Я потратил добрых 3 часа на поиски подсказок по всему Интернету, но не получаю подходящих ответов или не знаю, как задать вопрос.

Будем очень признательны за любые рекомендации о том, что искать.

ОБНОВЛЕНИЕ

Я могу зафиксировать изменения, используя соединение pyodbc и полную инструкцию вставки, однако pandas.DataFrame.to_sql () с механизмом SQLAlchemy не работает. Он отправляет данные в память вместо фактической базы данных, независимо от того, указана ли схема или нет.

Я был бы очень признателен за помощь с этим, или, возможно, мне нужно сообщить о проблеме с пандой?

3
Bartek Malysz 21 Ноя 2018 в 18:41

1 ответ

Лучший ответ

У меня была такая же проблема, я понял, что вам нужно указать pyodbc, какую базу данных вы хотите использовать. Для меня по умолчанию было master, поэтому мои данные оказались там.

Это можно сделать двумя способами:

connection.execute("USE <dbname>")

Или определите схему в df.to_sql():

df.to_sql(name=<TABELENAME>, conn=connection, schema='<dbname>.dbo')

В моем случае схема была <dbname>.dbo, я думаю, что .dbo используется по умолчанию, поэтому это может быть что-то еще, если вы определите альтернативную схему

На это есть ссылка в этом ответе, мне потребовалось немного больше времени, чтобы понять, каким должно быть имя схемы.

2
S.B.G 9 Янв 2020 в 19:09