SQLAlchemy-Fehler: "Argumentformate können nicht gemischt werden" beim Eingeben von variables

Ich habe ein Python-Skript, das eine pgSQL-file über die connection.execute-function von SQLAlchemy ausführt. Hier ist der Codeblock in Python:

results = pg_conn.execute(sql_cmd, beg_date = datetime.date(2015,4,1), end_date = datetime.date(2015,4,30)) 

Und hier ist einer der Bereiche, wo die Variable in meinem SQL eingegeben wird:

 WHERE ( dv.date >= %(beg_date)s AND dv.date <= %(end_date)s) 

Wenn ich das ausführe, erhalte ich einen kryptischen Python-Fehler:

 sqlalchemy.exc.ProgrammingError: (psycopg2.ProgrammingError) argument formats can't be mixed 

… gefolgt von einem riesigen Dump der anstößigen SQL-Abfrage. Ich habe diesen genauen Code zuvor mit der gleichen variableskonvention ausgeführt. Warum funktioniert es diesmal nicht?

Solutions Collecting From Web of "SQLAlchemy-Fehler: "Argumentformate können nicht gemischt werden" beim Eingeben von variables"

Wie sich herausstellte, hatte ich einen SQL-LIKE-Operator in der neuen SQL-Abfrage verwendet, und der% -Operand hatte mit der Python-Escaping-Fähigkeit zu kämpfen. Zum Beispiel:

  dv.device LIKE 'iPhone%' or dv.device LIKE '%Phone' 

Eine andere Antwort bot eine Möglichkeit, zu entkommen und zu entkommen, was meiner Meinung nach unnötigen Aufwand für ansonsten einfachen Code bedeuten würde. Stattdessen nutzte ich die Fähigkeit von pgSQL, Regex zu handhaben, um die SQL-Abfrage selbst zu modifizieren. Das änderte den obigen Teil der Abfrage zu:

  dv.device ~ E'iPhone.*' or dv.device ~ E'.*Phone$' 

Also für andere: Möglicherweise müssen Sie Ihre LIKE-Operatoren in '~' ändern, damit sie funktioniert. Denken Sie daran, dass es für große Abfragen viel langsamer ist. (Mehr Infos hier .)

Ich stieß auf ein ähnliches Problem wie Nikhil. Ich habe eine Abfrage mit LIKE Klauseln, die funktionierte, bis ich es LIKE , um eine Bindevariable einzuschließen, an welcher Stelle ich den folgenden Fehler empfing:

 DatabaseError: Execution failed on sql '...': argument formats can't be mixed 

Die Lösung besteht nicht darin, die LIKE-Klausel aufzugeben. Das wäre ziemlich verrückt, wenn psycopg2 einfach keine LIKE-Klauseln zulassen würde. %% können wir das Literal % mit %% . Zum Beispiel die folgende Abfrage:

 SELECT * FROM people WHERE start_date > %(beg_date)s AND name LIKE 'John%'; 

müsste geändert werden um:

 SELECT * FROM people WHERE start_date > %(beg_date)s AND name LIKE 'John%%'; 

Weitere Details finden Sie in der Dokumentation zu pscopg2: http://initd.org/psycopg/docs/usage.html#passing-parameters-to-sql-queries