PyODBC 迭代更新 - "Not a Query"

PyODBC Iterating Update - "Not a Query"

我正在努力从 SQL Server 2008 R2 table 中提取客户服务单的措辞 ("Note"),然后 运行 进行情绪分析并使用它分析以更新同一 table 中的 "Sentiment" 字段。以下是有关 table 字段的更多信息:

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: No results. Previous SQL was not a query.

我已经根据其他关于相同错误的帖子对我的代码进行了建模,但我找不到任何可以解决该问题的方法。这是代码:

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

感谢任何帮助!

不可能同时遍历游标结果使用相同的游标来执行其他语句。

如果需要逐个遍历 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 正在处理的特定行。