2016-03-24 9 views
0

Bir SQL Server 2008 R2 tablosundan Müşteri Hizmet biletinin ("Not") bir yetkisini ("Not") çekmeye çalışıyorum, daha sonra bir duyarlılık analizi çalıştırın ve "Sentiment" öğesini güncelleştirmek için bu analizi kullanın Aynı tablo içindeki alan. İşte tablo alanlarda daha fazla bilgi var: Ben aşağıdaki kodu çalıştırdığınızda, bu hatayı alıyorumPyODBC Güncelleştirmesi - "Bir Sorgu Yok"

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) 

: Bu aynı hata hakkında diğer gönderdikten sonra kodumu modelledik

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

ama Sorunu çözecek hiçbir şey bulamıyorum. İşte kod:

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

Herhangi bir yardım için teşekkür ederiz!

+0

UPDATE ifadesi bir WHERE deyimine ihtiyaç duyuyor gibi görünüyor, aksi halde her yineleme için tüm satırları güncelleştiriyor. – Bryan

cevap

1

aynı anda imlecin yineleme yapmak mümkün değildir ve diğer ifade işlemeye aynı imleci kullanın sonuçlanır.

gereksinimi iki imleci (örn belleğe sığmayacak kadar büyük sonuçları) birer SELECT sonuç birinin içinden yineleme ve harekete geçmeye, yönetmek ise

:

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

Ya SELECT resultset her zaman olacak eğer küçük olsun, sonuçları yineleme için bir listeye alın.

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

Kullanılan yönteme bakılmaksızın, işlemleri devam nedenle UPDATE belirli satır için kullanılabilir SELECT birincil anahtar eklemek istersiniz: Bu imleç yeniden kullanımını sağlar.

+0

Bryan, bu harika. Gönderin için teşekkürler. Dedi ki, bu bizi en çok yoldan çıkardı, ancak güncelleme sorgusu tüm satırları ilk kayıttan gelen duygu ile güncelliyor. Bir sayaca atmayı ve [a] satırını kullanmayı denedim, ama bu işe yaramadı ... – swaters

+0

Tablo için birincil anahtar nedir? Daha da iyisi, soruyu tablo için DDL ile düzenleyin. – Bryan

+0

Bryan, istenen bilgileri ekledim. Teşekkürler! – swaters