如何使用 pandas 截断表?

Adi*_*i E 5 python sql sql-server sqlalchemy pandas

我有一个执行几次的函数,每次它都使用以下代码将元素附加到 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)
Run Code Online (Sandbox Code Playgroud)

但是,在输入上述代码之前,我想截断(甚至删除)该表。我在 pandas.io.sql 中没有找到任何专用函数。所以我尝试创建一个空数据框只是为了调用:

df1 = pd.DataFrame()
df1.to_sql(out_tbl, engine, if_exists='replace', index=False)
Run Code Online (Sandbox Code Playgroud)

此代码确实删除了表,但随后在尝试重新创建空表时从 sqlalchemy 生成异常。我可以捕获并忽略它,下一次使用 if_exists='append' 调用 to_sql() 将正确创建表,但这非常丑陋。

我尝试的另一种方法是清除原始数据框中的所有行,保留列:

df1 = df.drop(df.index)
df1.to_sql(out_tbl, engine, if_exists='replace', index=False)
Run Code Online (Sandbox Code Playgroud)

这几乎有效:它截断表,但然后插入所有字段为 NULL 的单个记录...

目前我的解决方法是为此任务保留另一个 pyodbc 连接:

sql = "DELETE FROM " + out_tbl
try:
    cursor.execute(sql)
except:                     # mainly if table doesn't exist
    pass
Run Code Online (Sandbox Code Playgroud)

那么有没有一种简单的方法可以用 pandas 来完成这个简单的任务呢?

谢谢阿迪

小智 9

试试这个...我在我的项目中遇到了同样的问题,所以只需连接到数据库并执行 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)
Run Code Online (Sandbox Code Playgroud)