2016-08-11 4 views
1

Ich habe ein bisschen Probleme bei der Parametrisierung einer SQL-Abfrage mit Python. Weiß nicht genau, warum dieser Fehler passiert ... Wenn das Tupel zwei Mitglieder hat und ich zwei Parameter im SQL verwende, wie bekomme ich einen Fehler von einem Fehler?Parametrisierung einer Abfrage in Postgres mit Python

Fehlermeldung:

File "...\app.py", line 27, in main 
rows = User.daily_users_by_pool_name('2016-08-01', '2016-08-02') 
File "...\user.py", line 48, in daily_users_by_pool_name 
cursor.execute(query, (start_date, end_date)) 
IndexError: tuple index out of range 

Aufruf Funktion in Haupt:

rows = User.daily_users_by_pool_name('2016-08-01', '2016-08-02') 

Methode in der Klasse Benutzer:

from database import ConnectionFromPool 
from datetime import datetime 
import pandas as pd 
import numpy as np 
import psycopg2 
... 

@classmethod #static 
def daily_users_by_pool_name(cls, start_date, end_date): 
    '''returns a Pandas.DataFrame of results''' 

    query = """ 
      Select foo.dos::date, foo.cust_id 
      from foo f 
      join customer c on f.id = c.id 
      where foo.dos >= %s::DATE 
       and foo.dos < %s::DATE 
       and c.cust_name ilike '%_bar' 
       and c.baz not ilike 'test%' """ 


    with ConnectionFromPool() as cursor: 
     cursor.execute(query, (start_date, end_date)) 

     return pd.DataFrame(cursor.fetchall(), columns=['foo', 'cust_id']) 

Antwort

1

Escape the % Zeichen mit einer weiteren %

and c.cust_name ilike '%%_bar' 
and c.baz not ilike 'test%%' """ 
+0

ist das sicher von SQL-Injektion? – StillLearningToCode

+0

@StillLearningToCode Ich verstehe nicht, wie würde das SQL-Injektion ermöglichen ... –