我写了这段代码来删除表中的重复项。 它在Microsoft SQL Server Management Studio中执行时工作正常 但我不能让它用Python执行。
没有发生错误,它只是不起作用...... 我尝试执行其他查询也没有任何问题。
有人知道可能出现什么问题? 我正在使用Python 2.7
import pymssql
import time
conn = pymssql.connect(server='rfhete755', database='EEX')
c = conn.cursor()
p = """
SELECT [ID]
,[Operator]
,[Source]
,[Timestamp]
,ROW_NUMBER() OVER (
PARTITION BY [Operator]
,[Source]
,[Timestamp] ORDER BY [Timestamp]
) AS Rnum
FROM [EEX].[dbo].[Wind_Solar];
WITH CTE
AS (
SELECT [Operator]
,[Source]
,[Timestamp]
,ROW_NUMBER() OVER (
PARTITION BY [Operator]
,[Source]
,[Timestamp] ORDER BY [Timestamp]
) AS Rnum
FROM [EEX].[dbo].[Wind_Solar]
)
DELETE
FROM CTE
WHERE Rnum <> 1"""
print p
c.execute(p)
time.sleep(2)
conn.commit()
time.sleep(1)
c.close()
conn.close()
答案 0 :(得分:1)
class student{
public int id;
public String name;
@Override
public String toString() {
return name;
}
}
可以执行一个声明。您正在传递多个语句。将您的操作拆分为单独的cursor.execute()
来电:
cursor.execute()
您很可能并不想包含第一个select_all = """
SELECT [ID]
,[Operator]
,[Source]
,[Timestamp]
,ROW_NUMBER() OVER (
PARTITION BY [Operator]
,[Source]
,[Timestamp] ORDER BY [Timestamp]
) AS Rnum
FROM [EEX].[dbo].[Wind_Solar]"""
c.execute(select_all)
delete_all_but_first = """
WITH CTE
AS (
SELECT [Operator]
,[Source]
,[Timestamp]
,ROW_NUMBER() OVER (
PARTITION BY [Operator]
,[Source]
,[Timestamp] ORDER BY [Timestamp]
) AS Rnum
FROM [EEX].[dbo].[Wind_Solar]
)
DELETE
FROM CTE
WHERE Rnum <> 1"""
c.execute(delete_all_but_first)
。
我不确定您在Python代码中使用SELECT
语句的原因,不需要这些语句来确保正确执行。
如果您使用连接对象和游标作为上下文管理器,它们将自动关闭(不幸的是,pymmsql项目错过了在其上下文管理器实现中包含事务处理的机会):
time.sleep()