使用Python的SQL查询不起作用

时间:2015-12-10 11:28:46

标签: python sql

我写了这段代码来删除表中的重复项。 它在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()

1 个答案:

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