我有一个执行几次的函数,每次使用此代码将元素附加到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实现这个简单的任务吗?
感谢 阿迪
答案 0 :(得分:2)
尝试一下...我的项目中遇到了同样的问题 所以只需连接到db并执行truncate命令
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')
conn = engine.connect()
conn.execute("TRUNCATE TABLE out_tbl")
df.to_sql(out_tbl, engine, if_exists='append', index=False)