我使用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
这些负值意味着什么?在这些情况下,它似乎成功地写入了数据库。
1条答案
按热度按时间mrfwxfqh1#
你有一个软件栈,它的行为不是完全可靠的,预测的,记录的方式。我建议改变你的方法。
使用CREATE TABLE / DELETE FROM / TRUNCATE的某种组合来获得一个没有行的临时表。通常CREATE TABLE LIKE是一种方便的方法。
使用两个参数调用:
.to_sql(temp_table, con=con)
这成功INSERT并报告了行数,未发生任何事件。
现在,提交一个事务,将这些行转移到感兴趣的表中。您有几个选项:
当选择一个选项时,您现在可以完全灵活地使用数据库供应商或社区建议的任何技术,而不必通过
to_sql
提供的狭窄的跨供应商API进行传输。这使您重新坐在驾驶座上,因此您可以实现您想要的更可靠的解决方案。