2016-03-24 11 views
0

Ich arbeite daran, die Wortwahl eines Kundenservices ("Hinweis") aus einer SQL Server 2008 R2-Tabelle zu ziehen, dann eine Sentimentanalyse auszuführen und diese Analyse zu verwenden, um das "Sentiment" zu aktualisieren. Feld in der gleichen Tabelle. Hier weitere Informationen über die Tabellenfelder:PyODBC Iterationsaktualisierung - "Keine Abfrage"

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) 

Wenn ich den folgenden Code ausführen, bekomme ich diesen Fehler:

pyodbc.ProgrammingError: No results. Previous SQL was not a query.

ich meinen Code nach anderen Beiträgen zu diesem gleichen Fehler modelliert haben, aber ich Ich kann nichts finden, das das Problem lösen könnte. Hier ist der Code:

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

Ich schätze jede Hilfe!

+0

Die 'UPDATE'-Anweisung sieht aus, als brauche sie eine' WHERE'-Klausel, andernfalls aktualisiert sie alle Zeilen für jede Iteration. – Bryan

Antwort

1

Es ist nicht möglich, gleichzeitig durch Cursor iterieren führt und verwenden, um die gleichen Cursor andere Anweisungen auszuführen.

Wenn die Anforderung von einem (zB führt zu groß, um fit im Speicher) und Maßnahmen ergreifen, verwalten zwei Cursor durch die SELECT Ergebnisse einer iterieren:

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

Oder wenn das SELECT resultset wird immer klein sein, ziehen Sie die Ergebnisse in eine Liste für die Iteration. Dies ermöglicht Cursor Wiederverwendung:

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

Unabhängig von der verwendeten Methode werden Sie den Primärschlüssel in der SELECT so kann es zu UPDATE die bestimmte Zeile verwendet werden, enthalten sein sollen verarbeitet werden.

+0

Bryan, das ist großartig. Danke fürs Senden. Das heißt, es kommt uns am meisten, aber die Update-Abfrage aktualisiert alle Zeilen mit der Stimmung aus dem ersten Datensatz. Ich habe versucht, einen Zähler zu werfen und Zeile [a] zu verwenden, aber das hat nicht funktioniert ... – swaters

+0

Was ist der Primärschlüssel für den Tisch? Besser noch, bearbeiten Sie die Frage mit DDL für die Tabelle. – Bryan

+0

Bryan, ich habe die angeforderten Informationen hinzugefügt. Vielen Dank! – swaters