2015-10-14 93 views
1

作爲我對tweet的情感分析的一部分,我需要從我的數據庫中提取tweets,運行python腳本以獲取情感分數並將其插回到數據庫中。我的代碼Python與SQL。在for循環中插入列中的變量

部分:

#conneting to database (works perfect) 
cnxn = pyodbc.connect('DRIVER={SQL Server};SERVER=xxxxxxx\SQLEXPRESS;DATABASE=TestTwitter;UID=;PWD=') 
cursor = cnxn.cursor() 

#Alter table (works perfect) 
cursor.execute("ALTER TABLE TestTable ADD score2 varchar(255);") 

#select tweet from each row and calculate score (works perfect) 
cursor.execute("SELECT TestTable.Tweet FROM TestTable") 
for row in cursor.fetchall(): 
    print (row[0]) 
    sentim = sentiment(row[0]) 
    print (sentim) 

    #update table and add sentiment score for each row (not so perfect) 
    cursor.execute("Update TestTable SET score2 = '" + (str(sentim)) + "';") 
    cnxn.commit() 

當更新表,所有行會得到相同的情緒值作爲第一鳴叫,而不是自己的。 「print(sentiment)」逐個顯示每條推文的得分,但似乎循環在更新表格時不起作用。有任何解決這個問題的方法嗎?

回答

2

這不是while循環的問題,而是使用UPDATE命令;你要告訴它更新TestTable中的所有行,而不僅僅是你正在處理的那一行。您需要爲該UPDATE提供一個WHERE條件。

cursor.execute("SELECT TestTable.Tweet, TestTable.id FROM TestTable") 
for row in cursor.fetchall(): 
    ... 
    cursor.execute("Update TestTable SET score2 = %s WHERE id = %s;", (sentim, row[1])) 

(假設您的主鍵列名爲id)。

還要注意,你應該養成使用參數化查詢的習慣;儘管在這段代碼中沒有SQL注入的機會,因爲沒有任何東西來自用戶輸入,其他代碼可能有這個問題,所以最好完全避免它。

1

您需要使用where子句來限定update子句,該子句將更新的行限制爲要修改的行。

喜歡的東西cursor.execute("Update TestTable SET score2 = '" + (str(sentim)) + "' where Tweet = '" + row[0] + "';")

而不是使用Tweet列鍵你應該修改你的SELECT語句太提取主鍵和使用where子句中的。

此外,使用連接構建SQL語句可能是一個壞主意,因爲它可能使您暴露於SQL注入漏洞,因此您可能想要了解如何使用預準備語句或參數進行查詢。