pymysql.err.OperationalError: 1054. "Unknown column 'X' in 'where clause'

pymysql.err.OperationalError: 1054. "Unknown column 'X' in 'where clause'

我在控制台中收到以下错误,其中列名实际上是通过查询传递的值:

pymysql.err.OperationalError: (1054, "Unknown column 'LiqNac83437' in 'where clause'")

这是我的功能:

sql = f"""
            SELECT 
                detallev.clave,
                detallev.cantidad,
                venta.fecha
            FROM
                detallev
                    INNER JOIN
                venta ON detallev.ven_id = venta.ven_id
            WHERE
                clave = '{codigoBarras}'
            AND (fecha BETWEEN {fecha_inicio} AND {fecha_final});"""
    print(sql)
    with bd:
        with bd.cursor() as cursor:
            cursor.execute(sql)
            resultado = cursor.fetchall()
            cursor.close()

调用者:

@app.get('/{sucursal}/reporte/articulos/')
def reporte_articulo(sucursal: Origenes, clave: str = '', fecha_inicial: str = '', fecha_final: str = fechaHoy(), username: str = Depends(valida_usuario)):
    return reporte_articulos.reporte_articulo(sucursal, clave, fecha_inicial, fecha_final)

我正在使用 FastAPI、python 和 Mysql。 我已经尝试过遵循这些解决方案但没有成功:

Solution 2

和 Whosebug 之外的其他几个解决方案,已经尝试以不同类型的方式包装连接值。

发生这种情况是因为您自己替换了值,在这种情况下您没有正确引用 BETWEEN 子句中的字段。它看到 LiqNac83437 并认为它是一个列名,因为它没有被引用。

因此,为了避免 SQL 注入问题,您应该让数据库连接器进行引用:

    sql = """
            SELECT 
                detallev.clave,
                detallev.cantidad,
                venta.fecha
            FROM
                detallev
                    INNER JOIN
                venta ON detallev.ven_id = venta.ven_id
            WHERE
                clave = ?
            AND fecha BETWEEN ? AND ?;"""
    with bd.cursor() as cursor:
        cursor.execute(sql, (codigoBarras, fecha_inicio, fecha_final))
        resultado = cursor.fetchall()
        cursor.close()