2017-07-19 5 views
0

ist hier ein Stück meines Python-Code und die probe_id ist ein String:mysqldb Auto Add '' zu% s

sql = "select flow_id from t_static_flow where probe_id = %s"                             
cursor = connection.cursor()          
cursor.execute(sql, (probe_id,))         

Es funktioniert gut, und doch, wenn ich die SQL oben ändern

sql = "select flow_id from t_static_flow where probe_id = '%s'" 

Es gibt mir solche Fehler Infos:

(1064: „Sie haben einen Fehler in der SQL-Syntax, kontrollieren das Handbuch, die für die richtige Syntax zu Ihrer MySQL-Server-Version entspricht verwenden in der Nähe von‚123‘‚‘ in Zeile 1 ")

Wenn ich das '' umgebende% s hinzufüge, scheitert es. Aber warum ?

und ich schalte die mysql general_log um zu sehen, die sql ausgeführt werden.

2017-07-19T13:21:37.107960Z  85 Query  select flow_id from t_static_flow where probe_id = '123' 

Es ist meine erste Code sql log, die gut funktioniert.

aber ich denke, in den ersten Code der letzte SQL sein sollte:

select flow_id from t_static_flow where probe_id = 123 

wie es funktioniert?

Ich lese den MySQLdb Python-Code. in der Funktion ausführen:

if args is not None: 
if isinstance(args, dict): 
    query = query % dict((key, db.literal(item)) 
     for key, item in args.iteritems()) 
    else: 
     query = query % tuple([db.literal(item) for item in args]) 

Ich denke, es tut nicht die zusätzliche Arbeit sagte wie @money.

+0

Warum denken Sie, dass die letzte Abfrage sein sollte: Wählen Sie flow_id aus t_static_flow where Probe_id = 123. Probe_id ist ein String-Feld, dann sollte es von Anführungszeichen umgeben werden. – money

+0

aber wie zu erklären, dass es einen Fehler gibt, wenn ich das% s durch Anführungszeichen in sql wie dieses sql = "wähle flow_id von t_static_flow wo probe_id = '% s'"? – GuangshengZuo

+0

Ich denke cursor.execute (sql, (Probe_ID,)) nur Zeichenfolge entkommen und formatieren Zeichenfolge mit dem "Select flow_id von t_static_flow wo Probe_id =% s", und die% s ist nicht umgeben von Quote. – GuangshengZuo

Antwort

1

sich nach den Einzelheiten, auch ohne einen Apostroph bietet rund um den Wert, sieht letzte Abfrage wie
select flow_id from t_static_flow where probe_id = '123'
Wert bereits einfache Anführungszeichen hat, also wenn Sie explizit einzelne Anführungszeichen um den Wert hinzufügen, es es etwas machen wie
select flow_id from t_static_flow where probe_id = ''123'' and breaks the query.

+0

Was bedeutet "Wert hat schon einzelne Anführungszeichen"? Die Zeichenfolge von probe_id ist 123, ohne die einfachen Anführungszeichen – GuangshengZuo

1

Ich denke, ich habe die Antwort gefangen. Erstens danke @ money's Hilfe.

In MySQLdb der ausführen Funktion, die ich in Frage erwähnt, verwendet die wörtliche Funktion die Zeichenfolge zu entkommen. Tatsächlich ruft das Literal eine C-API auf, um dieses Problem zu lösen. Und die echte Fluchtfunktion ist mysql_real_escape_string. In diesem Dokument habe ich folgende Wörter gefunden:

Genau genommen benötigt MySQL nur diesen umgekehrten Schrägstrich und das Anführungszeichen, das verwendet wird, um die Zeichenfolge in der Abfrage zu zitieren, ist escaped.

Hier sind die Worte, die ich in _mysql.c

string_literal (obj) gefunden - konvertiert Objekt OBJ in eine SQL Stringliteral. Das bedeutet, dass alle speziellen SQL-Zeichen maskiert sind und in einfache Anführungszeichen eingeschlossen ist.

So zitiert es die Zeichenfolge in der mysql_real_esacep_string() - API und zurück.

So Im ausführen ‚s-Code, der query% ... die Zeichenfolge ersetzt bereits die einfachen Anführungszeichen enthalten.

wie @ money sagte.