【问题标题】:How can I truncate a table using pandas?如何使用熊猫截断表格?
【发布时间】: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


【解决方案1】:

试试这个...我在我的项目中遇到了同样的问题 所以只需连接到 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)

【讨论】:

    猜你喜欢
    • 2018-02-16
    • 1970-01-01
    • 2014-08-29
    • 1970-01-01
    • 2012-01-21
    • 1970-01-01
    • 1970-01-01
    • 2012-03-30
    • 1970-01-01
    相关资源
    最近更新 更多