【问题标题】:pandas.DataFrame.to_sql inserts data, but doesn't commit the transactionpandas.DataFrame.to_sql 插入数据,但不提交事务
【发布时间】:2019-04-24 05:35:21
【问题描述】:

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

这里说我不必像 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() 不起作用。无论是否指定了架构,它都会将数据发送到内存而不是实际的数据库。

非常感谢您对此的帮助,或者可能是我需要报告的熊猫问题?

【问题讨论】:

  • 你可以尝试在to_sql之后关闭连接
  • 添加 connection.close() 并不能解决任何问题
  • 这里的问题是to_sql函数中的con参数,把它从connection改成“engine”就可以了
  • @min2bro 检查过,但还是一样,还有其他建议吗?如果我理解正确,我传递的用户凭据具有读/写权限,否则 df.to_sql 会抛出错误,对吗?
  • 这些解决方案有效吗? stackoverflow.com/questions/48307008/…

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


【解决方案1】:

我有同样的问题,我意识到你需要告诉 pyodbc 你想使用哪个数据库。对我来说,默认是 master,所以我的数据就在那里。

有两种方法可以做到这一点:

connection.execute("USE <dbname>")

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

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

在我的例子中,架构是 &lt;dbname&gt;.dbo 我认为 .dbo 是默认的,所以如果你定义一个替代架构,它可能是别的东西

这在this 答案中被引用,我花了一点时间才意识到架构名称应该是什么。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-10
    • 2016-04-23
    • 1970-01-01
    • 1970-01-01
    • 2018-05-10
    • 1970-01-01
    相关资源
    最近更新 更多