【发布时间】:2014-11-30 01:16:39
【问题描述】:
我有一个执行几次的函数,每次它使用以下代码将元素附加到 SQL Server 上的表:
import pandas as pd
import pandas.io.sql as pdsql
import pyodbc
params = [(self.key[int(el[0])], bid, label, tr_date, el[1]) for el in elements]
df = pd.DataFrame(params, columns=['ID', 'BID', 'Label', 'tr_date', 'Score'])
engine = sqlalchemy.create_engine('mssql+pyodbc://MY-SERVER/Test')
df.to_sql(out_tbl, engine, if_exists='append', index=False)
但是,在输入上述代码之前,我想截断(甚至删除)表格。我在 pandas.io.sql 中没有找到任何专用函数。所以我尝试创建一个空数据框来调用:
df1 = pd.DataFrame()
df1.to_sql(out_tbl, engine, if_exists='replace', index=False)
此代码确实删除了表,但随后在 sqlalchemy 尝试重新创建空表时生成异常。我可以捕捉并忽略它,下一次使用 if_exists='append' 调用 to_sql() 将正确创建表,但这很丑陋。
我尝试的另一种方法是清除原始数据框中的所有行,保留列:
df1 = df.drop(df.index)
df1.to_sql(out_tbl, engine, if_exists='replace', index=False)
这几乎可行:它会截断表,然后插入一条所有字段为 NULL 的记录...
目前我的解决方法是为这个任务保留另一个 pyodbc 连接:
sql = "DELETE FROM " + out_tbl
try:
cursor.execute(sql)
except: # mainly if table doesn't exist
pass
那么有没有一种简单的方法可以用 pandas 完成这个简单的任务?
谢谢 阿迪
【问题讨论】:
-
如果您使用的空 DataFrame 具有正确的列会怎样?
DataFrame(columns=['ID', 'BID', 'Label', 'tr_date', 'Score'])。我有点认为你最好的办法是先用 sqlachemy 删除表。 -
感谢@Andy,我在
df1 = df.drop(df.index)测试的第二个案例实际上创建了一个具有正确列的空DataFrame,但正如我所写的那样,它截断了但在所有字段中插入了一条NULL 记录。我不知道如何使用 sqlalchemy 删除它(只是使用炼金引擎能够将 pandas to_sql() 用于 mssql),但我可以使用 pyodbc 删除它。问题是是否可以使用 pandas api 截断它 -
我认为作为 github 上的错误报告会更好:github.com/pydata/pandas/issues
标签: python sql sql-server pandas sqlalchemy