PyODBC迭代更新 - “不是查询”

时间:2016-03-24 15:54:08

标签: python sql-server tsql pyodbc

我正在努力从SQL Server 2008 R2表中提取客户服务票证的措辞(“注释”),然后运行情绪分析并使用该分析来更新同一表中的“情绪”字段。以下是关于表格字段的更多信息:

TicketNoteID(PK, int, not null)
TicketID (FK, int, not null)
UserName (varchar(20), not null)
Note (varchar(max), not null)
Author (varchar(50), not null)
isExternal (bit, null)
DateTimeCreated (datetime, not null)
NoteID (int, null)
DateTimeUploaded (datetime, null)
Error (bit, null)
ErrorMessage (varchar(max), null)
Sentiment (float, null)

当我运行以下代码时,我收到此错误:

  

pyodbc.ProgrammingError:没有结果。以前的SQL不是查询。

我在其他帖子之后对我的代码建模了同样的错误,但我找不到任何可以解决问题的内容。这是代码:

import pyodbc
from textblob import TextBlob

cnxn = pyodbc.connect(r'DRIVER={SQL Server Native Client 11.0};SERVER=...')

cur = cnxn.cursor()

sql = """
    SELECT Note
    FROM dbo.DSDTicketNotes
    where Sentiment is NULL
"""
rows = cur.execute(sql)

for row in rows:
    note = cur.fetchone()
    row = str(note)
    blob = TextBlob(row)
    sent = blob.sentiment.polarity
    sentUpdate = cur.execute("UPDATE dbo.DSDTicketNotes SET Sentiment = ?", sent)

cur.close()
cnxn.close()

我感谢任何帮助!

1 个答案:

答案 0 :(得分:3)

无法同时迭代游标结果使用相同的游标执行其他语句。

如果要求是逐个遍历SELECT结果(例如结果太大而无法适应内存)并采取措施,请管理两个游标:

...
selectCur = cnxn.cursor()
updateCur = cnxn.cursor()

selectSQL = """
    SELECT TicketNoteID, Note
    FROM dbo.DSDTicketNotes
    where Sentiment is NULL
"""

updateSQL = """
    UPDATE dbo.DSDTicketNotes
    SET Sentiment = ?
    WHERE TicketNoteID = ?
"""

for row in selCur.execute(selectSQL):
    id = row[0]
    blob = TextBlob(str(row[1]))
    sent = blob.sentiment.polarity
    updateCur = updateCur.execute(updateSQL, (sent, id))
    updateCur.commit()
...

或者,如果SELECT结果集总是很小,请将结果拉入列表进行迭代。这允许游标重用:

...
cur = cnxn.cursor()

selectSQL = """
    SELECT TicketNoteID, Note
    FROM dbo.DSDTicketNotes
    where Sentiment is NULL
"""

updateSQL = """
    UPDATE dbo.DSDTicketNotes
    SET Sentiment = ?
    WHERE TicketNoteID = ?
"""

rows = cur.execute(selectSQL).fetchall()
for row in rows:
    id = row[0]
    blob = TextBlob(str(row[1]))
    sent = blob.sentiment.polarity
    cur = cur.execute(updateSQL, (sent, id))
    cur.commit()
...

无论使用何种方法,您都希望在SELECT中包含主键,以便它可以用于UPDATE正在处理的特定行。