Saltar al contenido

Python MySQL escapar caracteres especiales

Hacemos una verificación profunda cada una de las secciones en nuestro sitio web con el objetivo de mostrarte en todo momento información certera y actualizada.

Solución:

Esta es una de las razones por las que se supone que debe usar el enlace de parámetros en lugar de formatear los parámetros en Python.

Solo haz esto:

sql = 'UPGRADE inventory_server set server_mac = %s where server_name = %s'

Luego:

cur.execute(sql, macs, host)

De esa manera, usted puede simplemente tratar con el string como un stringy deje que la biblioteca MySQL descubra cómo citarlo y escaparlo por usted.

Además de eso, generalmente obtiene un mejor rendimiento (porque MySQL puede compilar y almacenar en caché una consulta y reutilizarla para diferentes valores de parámetros) y evitar ataques de inyección SQL (una de las formas más comunes de ser pirateado).

Bienvenido al mundo de string formatos de codificación!

tl;dr: el método preferido para manejar comillas y caracteres de escape al almacenar datos en columnas MySQL es usar consultas parametrizadas y dejar que el controlador MySQLDatabase lo maneje. Alternativamente, puede evitar las comillas y las barras inclinadas duplicándolas antes de la inserción.

Ejemplo completo en la parte inferior del enlace

actualización de SQL estándar

# as_json must have escape slashes and quotes doubled
query = """
        UPDATE json_sandbox
        SET data = ''
        WHERE id = 1;
    """.format(as_json)

with DBConn(*client.conn_args) as c:
    c.cursor.execute(query)
    c.connection.commit()

actualización de SQL parametrizado

# SQL Driver will do the escaping for you
query = """
        UPDATE json_sandbox
        SET data = %s
        WHERE id = %s;
    """

with DBConn(*client.conn_args) as c:
    c.cursor.execute(query, (as_json, 1))
    c.connection.commit()

SQL JSON no válido


  "abc": 123,
  "quotes": "ain't it great",
  "multiLine1": "hellonworld",
  "multiLine3": "hellornuniversern"

SQL JSON válido


  "abc": 123,
  "quotes": "ain''t it great",
  "multiLine1": "hello\nworld",
  "multiLine3": "hello\r\nuniverse\r\n"

Transformación de Python:

# must escape the escape characters, so each slash is doubled
# Some MySQL Python libraries also have an escape() or escape_string() method.
as_json = json.dumps(payload) 
    .replace("'", "''") 
    .replace('\', '\\')

Ejemplo completo

import json
import yaml

from DataAccessLayer.mysql_va import get_sql_client, DBConn

client = get_sql_client()

def encode_and_store(payload):
    as_json = json.dumps(payload) 
        .replace("'", "''") 
        .replace('\', '\\')

    query = """
            UPDATE json_sandbox
            SET data = ''
            WHERE id = 1;
        """.format(as_json)

    with DBConn(*client.conn_args) as c:
        c.cursor.execute(query)
        c.connection.commit()

    return

def encode_and_store_2(payload):
    as_json = json.dumps(payload)

    query = """
            UPDATE json_sandbox
            SET data = %s
            WHERE id = %s;
        """

    with DBConn(*client.conn_args) as c:
        c.cursor.execute(query, (as_json, 1))
        c.connection.commit()

    return


def retrieve_and_decode():
    query = """
        SELECT * FROM json_sandbox
        WHERE id = 1
    """

    with DBConn(*client.conn_args) as cnx:
        cursor = cnx.dict_cursor
        cursor.execute(query)

        rows = cursor.fetchall()


    as_json = rows[0].get('data')

    payload = yaml.safe_load(as_json)
    return payload



if __name__ == '__main__':

    payload = 
        "abc": 123,
        "quotes": "ain't it great",
        "multiLine1": "hellonworld",
        "multiLine2": """
            hello
            world
        """,
        "multiLine3": "hellornuniversern"
    


    encode_and_store(payload)
    output_a = retrieve_and_decode()

    encode_and_store_2(payload)
    output_b = retrieve_and_decode()

    print("original: ".format(payload))
    print("method_a: ".format(output_a))
    print("method_b: ".format(output_b))

    print('')
    print(output_a['multiLine1'])

    print('')
    print(output_b['multiLine2'])

    print('nAll Equal?: '.format(payload == output_a == output_b))

Ejemplo de Python sobre cómo insertar texto sin procesar:

Crear una tabla en MySQL:

create table penguins(id int primary key auto_increment, msg VARCHAR(4000))

código pitón:

#!/usr/bin/env python
import sqlalchemy
from sqlalchemy import text

engine = sqlalchemy.create_engine(
    "mysql+mysqlconnector://yourusername:[email protected]/your_database")
db = engine.connect()

weird_string = "[email protected]#$%^&*()_+`1234567890-=|[];':""

sql = text('INSERT INTO penguins (msg) VALUES (:msg)')
insert = db.execute(sql, msg=weird_string)

db.close()

Ejecútelo, examine la salida:

select * from penguins

1      [email protected]#$%^&*()_+`1234567890-=|[];':"

Ninguno de esos caracteres se interpretó en la inserción.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *