2015-10-14 3 views
1

как часть моего анализа настроений по твитам, мне нужно извлечь твиты из моей базы данных, запустить скрипт python, чтобы получить оценку настроений и вставить ее обратно в базу данных.Python & SQL. Вставляя переменную в столбце while for for loop

Часть моего кода:

#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, а не только тот, над которым вы работаете. Вы должны предоставить условие WHERE этому UPDATE.

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

Вам нужно квалифицировать предложение update с предложением where, которое ограничивает строки, которые вы обновляете, тому, который вы хотите изменить.

Что-то вроде cursor.execute("Update TestTable SET score2 = '" + (str(sentim)) + "' where Tweet = '" + row[0] + "';")

Вместо использования Tweet столбец как ключ, который вы, вероятно, следует изменить ваш оператор выбора, чтобы извлечь первичный ключ слишком и использовать его в ИНЕКЕ.

Кроме того, использование конкатенации для создания операторов SQL может быть плохой идеей, так как это может привести к уязвимости SQL-инъекций, поэтому вам может понадобиться изучить, как использовать подготовленные инструкции или параметры для запроса.