pandas.DataFrame.to_sql插入数据,但不提交事务

时间:2018-11-21 15:41:41

标签: sql-server python-3.x pandas sqlalchemy pandas-to-sql

我有一个熊猫数据框,正尝试按以下方式插入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那样做:

Does the Pandas DataFrame.to_sql() function require a subsequent commit()?

,以下建议不起作用:

Pandas to_sql doesn't insert any data in my table

我花了3个小时在整个互联网上寻找线索,但是我没有得到任何相关的答案,或者我不知道该怎么问。

任何有关查找内容的指导都将受到高度赞赏。

更新

我可以使用pyodbc连接和完整插入语句来提交更改,但是带有SQLAlchemy引擎的pandas.DataFrame.to_sql()不起作用。不管是否指定架构,它都会将数据发送到内存而不是实际的数据库。

真的很感谢您的帮助,或者这可能是我需要报告的熊猫问题?

1 个答案:

答案 0 :(得分:2)

我遇到了同样的问题,我意识到您需要告诉pyodbc您要使用哪个数据库。对我来说,默认值是master,所以我的数据到此为止。

您可以通过两种方式进行此操作:

connection.execute("USE <dbname>")

或在df.to_sql()中定义架构:

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

在我的情况下,模式为<dbname>.dbo,我认为.dbo是默认模式,因此如果您定义其他模式,则可能是其他情况

此问题在this答案中得到了引用,我花了更长的时间才意识到架构名称应该是什么。