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.