Python & SQL。在 for 循环中的列中插入变量
Python & SQL. Inserting variable in column while in for loop
作为推文情绪分析的一部分,我需要从我的数据库中提取推文,运行 一个 python 脚本来获取情绪分数并将其插入回数据库中。
我的部分代码:
#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()
更新 table 时,所有行都获得与第一条推文相同的情绪值,而不是它们自己的。 "print (sentiment)" 一条一条地显示了每条推文的得分,但似乎在更新 table 时循环不起作用。有什么办法可以解决这个问题?
这不是 while 循环的问题,而是您的 UPDATE 命令的问题;您告诉它更新 TestTable 中的所有行,而不仅仅是您正在处理的行。您需要为该更新提供 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 注入的机会,因为没有任何内容来自用户输入,但其他代码可能存在该问题,因此最好完全避免它。
您需要使用 where 子句来限定更新子句,该子句将您更新的行限制为您要修改的行。
类似于cursor.execute("Update TestTable SET score2 = '" + (str(sentim)) + "' where Tweet = '" + row[0] + "';")
与其使用 Tweet
列作为键,不如修改 select 语句以提取主键并在 where 子句中使用它。
此外,使用连接构建 SQL 语句可能不是一个好主意,因为它可能会使您暴露于 SQL 注入漏洞,因此您可能想探索如何使用准备好的语句或参数查询。
作为推文情绪分析的一部分,我需要从我的数据库中提取推文,运行 一个 python 脚本来获取情绪分数并将其插入回数据库中。
我的部分代码:
#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()
更新 table 时,所有行都获得与第一条推文相同的情绪值,而不是它们自己的。 "print (sentiment)" 一条一条地显示了每条推文的得分,但似乎在更新 table 时循环不起作用。有什么办法可以解决这个问题?
这不是 while 循环的问题,而是您的 UPDATE 命令的问题;您告诉它更新 TestTable 中的所有行,而不仅仅是您正在处理的行。您需要为该更新提供 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 注入的机会,因为没有任何内容来自用户输入,但其他代码可能存在该问题,因此最好完全避免它。
您需要使用 where 子句来限定更新子句,该子句将您更新的行限制为您要修改的行。
类似于cursor.execute("Update TestTable SET score2 = '" + (str(sentim)) + "' where Tweet = '" + row[0] + "';")
与其使用 Tweet
列作为键,不如修改 select 语句以提取主键并在 where 子句中使用它。
此外,使用连接构建 SQL 语句可能不是一个好主意,因为它可能会使您暴露于 SQL 注入漏洞,因此您可能想探索如何使用准备好的语句或参数查询。