mySQL Python - 更新不更新

问题描述 投票:0回答:1

你好,我在Python中使用mySQL,但我的update函数没有更新行,我不能理解错误信息。

def atualizaCartelaTabela(campo,valor,jogador):
    try:
        connection = mysql.connector.connect(host='localhost',
                                     user='root',
                                     password='root',
                                     database='modular')
        cursor = connection.cursor() 
        sql = """UPDATE Cartela 
                SET %s = %s
                WHERE PONTOS = %s"""
        atualiza = (campo,valor,jogador)
        cursor.execute(sql,atualiza)
    except Error as e:
        print("Erro ao atualizar campos da tabela Cartela ->", e)
    finally:
        if connection.is_connected():
            cursor.close()
            connection.close()

def atualizaCartelaTabela(campo,valor,jogador):
    try:
        connection = mysql.connector.connect(host='localhost',
                                     user='root',
                                     password='root',
                                     database='modular')
        cursor = connection.cursor() 
        sql = """UPDATE Cartela 
                SET %s = %s
                WHERE PONTOS = %s"""
        atualiza = (campo,valor,jogador)
        cursor.execute(sql,atualiza)
    except Error as e:
        print("Erro ao atualizar campos da tabela Cartela ->", e)
    finally:
        if connection.is_connected():
            cursor.close()
            connection.close()

atualizaCartelaTabela('Um',2,'Jogador 1')

我得到的错误。

1064 (42000): 你的SQL语法有错误,请检查你的MySQL服务器版本对应的手册,在第2行''Um' = 2 WHERE PONTOS = 'Jogador 1''附近使用正确的语法。

而且,这是用于创建表(工作)的函数。

def criaTabelaCartela():
    try:
        connection = mysql.connector.connect(host='localhost',
                                     user='root',
                                     password='root',
                                     database='modular')
        cursor = connection.cursor()  
        cursor.execute("CREATE TABLE Cartela (PONTOS VARCHAR(10), Um int(2), Dois int(1), Tres int(1), Quatro int(1), Cinco int(1), Seis int(1), Full int(1), SequenciaBaixa int(1), Trinca int(1), Quadra int(1), SequenciaAlta int(1), Yahtzee int(1), PontuaçãoFinal int(1))")
        connection.commit()
    except Error as e:
        print("Erro ao criar tabela Cartela ->", e)
    finally:
        if connection.is_connected():
            cursor.close()
            connection.close()
python mysql-python
1个回答
0
投票

从这3条语句中寻找导致错误的原因。

sql = """UPDATE Cartela 
        SET %s = %s
        WHERE PONTOS = %s"""
atualiza = (campo,valor,jogador)
cursor.execute(sql,atualiza)

当你把 SET X = "y" 在更新查询中,列名 X 不能被参数化。只有值。

所以列名为 campo 应直接在SQL字符串中替换,而不是在 execute - 但请注意,这是不安全的。将第一个参数改为 {} 格式的符号,并将值保留为 %s 以便它们成为 execute():

sql = """UPDATE Cartela 
        SET {} = %s
        WHERE PONTOS = %s""".format(campo)  # unsafe
atualiza = valor, jogador
cursor.execute(sql, atualiza)

作为一项安全检查,请确保以下数值: campo 是表中某一列的名称,除了 PONTOS 或任何一个导入键列。最好检查一下它是否在你要允许更新的列的白名单中。


0
投票

我猜测 int - 2 是这里的问题。试试这个:

让你的 SQL-query 这个。

sql = """
    UPDATE Cartela 
    SET %s = CAST(%s AS int)
    WHERE PONTOS = %s
"""

而你调用方法的地方 atualizaCartelaTabela 使之

atualizaCartelaTabela('Um','2','Jogador 1')
© www.soinside.com 2019 - 2024. All rights reserved.