【问题标题】:Python & SQL. Inserting variable in column while in for loopPython 和 SQL。在for循环中在列中插入变量
【发布时间】:2015-10-14 08:09:55
【问题描述】:

作为我对推文的情绪分析的一部分,我需要从我的数据库中提取推文,运行 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()

更新表时,所有行都获得与第一条推文相同的情绪值,而不是它们自己的。 “打印(情绪)”一一显示每条推文的得分,但更新表格时似乎循环不起作用。有什么办法解决这个问题?

【问题讨论】:

    标签: python sql sql-server sentiment-analysis


    【解决方案1】:

    这不是 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 注入的可能性,因为用户输入没有任何内容,其他代码可能有这个问题,所以最好完全避免它。

    【讨论】:

      【解决方案2】:

      您需要使用 where 子句限定更新子句,该子句将您更新的行限制为您要修改的行。

      类似cursor.execute("Update TestTable SET score2 = '" + (str(sentim)) + "' where Tweet = '" + row[0] + "';")

      除了使用Tweet 列作为键之外,您还应该修改您的选择语句以提取主键并在where 子句中使用它。

      此外,使用连接来构建 SQL 语句可能不是一个好主意,因为它可能会使您暴露于 SQL 注入漏洞,因此您可能想探索如何使用准备好的语句或参数进行查询。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-05
        • 1970-01-01
        • 2022-11-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多