python - PyODBC 迭代更新 - "Not a Query"

标签 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: 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正在处理的特定行。

关于python - PyODBC 迭代更新 - "Not a Query",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36204527/

相关文章:

python - 在 mako 文件中将\n 转换为 <br>

python - 如何将来自 AWS ECR 的私有(private)镜像与 Airflow 的 DockerOperator 一起使用?

python - 如何在 python pandas 中显示重复的 ID 和重复的数据

sql-server - SQL 中的双重计数结果

sql-server - TSQL RAISERROR 作为警告

python - 在此 Python 示例中,运算符绑定(bind)如何工作?

c# - Q : How can I execute a query string in ASP. NET核心?

sql-server - 在 T-SQL 中生成随机字符串

sql-server - ';'在 SQL 语句的开头

.net - 事务中的数据库过程是否仍会从 ADO.net 事务中回滚?