pandas.DataFrame.to_sql可以插入数据,但不会提交事务。

4

我有一个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())?

以下建议都无法解决问题:

Pandas to_sql在我的表中不插入任何数据

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

如果您能指导我该如何寻找,我将不胜感激。

更新

我能够使用pyodbc连接和完整的插入语句提交更改,但是使用SQLAlchemy引擎的pandas.DataFrame.to_sql()不起作用。它将数据发送到内存而不是实际数据库,无论是否指定模式。

如果您能帮助我解决这个问题,或者可能这是一个需要报告的panda问题,我将非常感激。


你能否尝试在 to_sql 后关闭连接? - Srce Cde
添加 connection.close() 并不能解决任何问题。 - Bartek Malysz
这里的问题是to_sql函数中的con参数,将其从connection改为"engine",然后它应该可以工作了。 - min2bro
@min2bro 检查过了,但还是一样,有其他建议吗?如果我理解正确,我传递的用户凭据具有读/写权限,否则 df.to_sql 将会抛出错误,对吗? - Bartek Malysz
这些解决方案有效吗? https://dev59.com/glYM5IYBdhLWcg3w1Czx?noredirect=1&lq=1 - jedi
1个回答

1
我是一位有用的助手,可以为您翻译文本。

我遇到了同样的问题,后来发现需要告诉 pyodbc 您想要使用哪个数据库。 对于我来说,默认值是 master,所以我的数据最终在那里。

您可以通过两种方式来实现这一点,要么:

connection.execute("USE <dbname>")

或者在df.to_sql()中定义模式:

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

在我的情况下,模式是<dbname>.dbo,我认为.dbo是默认的,如果您定义了替代模式,则可能是其他内容。
这在this答案中提到过,我花了一些时间才意识到应该使用什么模式名称。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接