在Pandas中调用to_sql()时,负返回值意味着什么?

dgenwo3n  于 2023-03-21  发布在  其他
关注(0)|答案(1)|浏览(249)

我使用Pandas函数to_sql()sqlalchemy.create_engine建立的mssql+pyodbc://连接将各种 Dataframe 发送到Microsoft SQL Server。有时to_sql()返回写入的行数,这是我在Returns文档中所期望的:
受to_sql影响的行数。如果传入方法的可调用对象不返回整数行数,则返回None。
受影响的返回行数是sqlite3.Cursor或SQLAlchemy connectable的rowcount属性的总和,它可能不反映sqlite3或SQLAlchemy中规定的写入行数的确切数量。
但在某些情况下,我看到它返回负值,如-1,2,-11,-56。如果我使用method="multi",这种行为就消失了。这里我写了一个有325条记录的表:

>>> PLSUBMITTALTYPE.to_sql("PLSubmittalType", con=data_lake, if_exists="replace")
-1

>>> PLSUBMITTALTYPE.to_sql("PLSubmittalType", con=data_lake, if_exists="replace", method="multi", chunksize = 50)
325

这些负值意味着什么?在这些情况下,它似乎成功地写入了数据库。

mrfwxfqh

mrfwxfqh1#

你有一个软件栈,它的行为不是完全可靠的,预测的,记录的方式。我建议改变你的方法。
使用CREATE TABLE / DELETE FROM / TRUNCATE的某种组合来获得一个没有行的临时表。通常CREATE TABLE LIKE是一种方便的方法。
使用两个参数调用:.to_sql(temp_table, con=con)
这成功INSERT并报告了行数,未发生任何事件。
现在,提交一个事务,将这些行转移到感兴趣的表中。您有几个选项:

  • INSERT所有行(可能忽略错误)
  • 更新所有行
  • 使用JOIN分离新值/现有值,并执行单独的INSERT / UPDATE
  • 一些其它厂商特定UPSERT技术

当选择一个选项时,您现在可以完全灵活地使用数据库供应商或社区建议的任何技术,而不必通过to_sql提供的狭窄的跨供应商API进行传输。这使您重新坐在驾驶座上,因此您可以实现您想要的更可靠的解决方案。

相关问题