首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Python的SQL查询不起作用

使用Python的SQL查询不起作用
EN

Stack Overflow用户
提问于 2015-12-10 11:28:45
回答 1查看 2.6K关注 0票数 2

我编写了这段代码来删除表中的重复项。在中执行时,它工作得很好,但我无法让它与Python一起执行。

没有错误发生,只是不起作用.我也尝试过执行其他查询,没有任何问题。

有人想出什么事了吗?我正在使用Python2.7

代码语言:javascript
运行
复制
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()
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-10 11:32:07

cursor.execute()可以执行一条语句。您正在传递多个语句。将操作拆分为单独的cursor.execute()调用:

代码语言:javascript
运行
复制
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)

很可能您并不打算包含第一个SELECT

我不知道为什么在Python代码中使用time.sleep()语句,不需要这些语句来确保正确的执行。

如果您使用连接对象和游标作为上下文管理器,它们将自动关闭(不幸的是,pymmsql项目错过了在其上下文管理器实现中包含事务处理的机会):

代码语言:javascript
运行
复制
with pymssql.connect(server='rfhete755', database='EEX') as conn:
    with conn.cursor() as c:
       c.execute(delete_all_but_first)
    conn.commit()
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34200725

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档