2017-04-05 26 views
0

Was ist eine sichere Möglichkeit, die Nummer in der vorletzten Zeile dieser SQL-Abfrage durch eine Variable zu ersetzen?Python-Variable in langen SQL-Zeichenfolge

Sagen Sie, meine Variable ist customer_id. Kann ich {} anstelle von 2 verwenden und .format (customer_id) am Ende dieser Zeichenfolge einfügen?

unlicensed_query = """ 
    SELECT SUM(x.quantity), SUM(x.quantity * p.list_price) 
     FROM (
     SELECT cu.customer_id, cu.product_id, cu.quantity 
     FROM csi_usage cu LEFT JOIN csi c 
     ON cu.customer_id = c.customer_id 
     AND cu.product_id = c.product_id 
     WHERE c.product_id IS NULL 
     AND cu.customer_id = 2) x, product p 
     WHERE x.product_id = p.id; 
    """ 
+0

welche datenbank? – thebjorn

+0

mysql aber die Abfrage wird mit sqlalchemy wie folgt ausgeführt: self.session.execute (unlicensed_query) .fetchall() [0] – Casey

+3

Hier klicken: http://docs.sqlalchemy.org/en/latest/core/tutorial.html # specification-bound-parameter-behaviors – thebjorn

Antwort

2

Wie thebjorn angegeben, der richtige Weg, dies zu tun ist, gebundenen Parameter (http://docs.sqlalchemy.org/en/latest/core/tutorial.html#specifying-bound-parameter-behaviors) zu verwenden. Ein Beispiel ist hier:

from sqlalchemy.sql import text 
fully_utilized_query = text(""" 
    SELECT SUM(x.quantity) 
      FROM (
      SELECT cu.customer_id, cu.product_id, cu.quantity 
      FROM csi_usage cu 
      JOIN csi c 
      ON cu.customer_id = c.customer_id 
      AND cu.product_id = c.product_id 
      AND cu.quantity = c.licence_qty 
      WHERE cu.customer_id = :customer_id) x; 
    """) 
fully_utilized = self.session.execute(fully_utilized_query, {'customer_id': current_user.customer_id}).scalar()