如何使用pandas截断表?

时间:2014-10-05 17:06:20

标签: python sql sql-server pandas sqlalchemy

我有一个执行几次的函数,每次使用此代码将元素附加到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实现这个简单的任务吗?

感谢 阿迪

1 个答案:

答案 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)