【问题标题】:Deleting rows from SQL-database after a specific date using Python [duplicate]使用Python在特定日期之后从SQL数据库中删除行[重复]
【发布时间】:2022-01-07 01:07:59
【问题描述】:

我是一个真正的菜鸟,所以我希望有人可以轻松地帮助我。我想删除具有特定日期(min_date)或更晚的所有行。代码如下:

import pandas as pd
import pyodbc


print()
print("please wait while I import your file")
print()

data = pd.read_excel (r'C:\Users\xxx\OneDrive - xxx\Temp\2020_12_xxx.xlsx')   
df = pd.DataFrame(data)
df = df.fillna(value=" ")
df['To_date']=pd.to_datetime(df['To_date'])

print(df)

min_date = df['To_date'].min()
print()
print("Data is loaded from:")
print()
print(min_date)


print()
print("data is in DataFrame, please wait")
print()

conn = pyodbc.connect('Driver={ODBC Driver 17 for SQL Server};'
                      'Server=xxx.net;'
                      'Database=yyy;'
                      'Persist Security Info=False;'
                      'Authentication=ActiveDirectoryIntegrated')

cur = conn.cursor()

cur.execute('DELETE FROM FMK WHERE To_Date >= min_date')


conn.commit()

现在,当我运行它时,我收到错误消息:

ProgrammingError: ('42S22', "[42S22] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]列名'min_date'无效。(207) (SQLExecDirectW)")

如您所见,min_date 是一个来自 DF 的变量。我只是不希望必须在那里输入一个列名。我做错了什么?

【问题讨论】:

  • 您的min_date 是一个文字字符串。您需要使用该变量 - 可能使用准备好的语句。

标签: python sql pandas


【解决方案1】:

查询中的min_date 只是一个普通字符串,正如您在错误消息中注意到的那样,它被视为列名,因此,您需要将其放置在占位符中。

cur.execute('DELETE FROM FMK WHERE To_Date >= %s', min_date)

cur.execute("""DELETE FROM FMK WHERE To_Date >= '{0}'""".format(min_date))

【讨论】:

  • @HPython_noob,即使第一个也可以,也许您只需将“min_date”转换为字符串,然后再将其传递给查询。因为它是一个 datetime pandas 对象。
猜你喜欢
  • 1970-01-01
  • 2012-01-04
  • 2018-01-18
  • 2017-03-06
  • 1970-01-01
  • 1970-01-01
  • 2020-05-29
  • 2018-11-15
  • 2020-08-03
相关资源
最近更新 更多