PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Die read_sql-Abfrage gibt einen leeren Datenrahmen zurück, nachdem ich Parameter als Diktat in Python-Pandas übergeben habe

Ja, ich bin mir ziemlich sicher, dass Ihr Problem darauf zurückzuführen ist, dass Sie versucht haben, Spaltennamen in Ihrer Abfrage über die Parameterbindung festzulegen (and %(target)s in ('ACT')). ) wie in den Kommentaren erwähnt.

Dies führt dazu, dass Ihre Abfrage die Ergebnismenge auf Datensätze beschränkt, bei denen 'status' in ('ACT') ist (d.h. ist der String 'status' ein Element einer Liste, die nur den String 'ACT' enthält?). Dies ist natürlich falsch, daher wird kein Datensatz ausgewählt und Sie erhalten ein leeres Ergebnis.

Dies sollte wie erwartet funktionieren:

import psycopg2.sql

col_name = 'status'
table_name = 'public.churn_data'
query_params = {'date_from':'201712',
                'date_to':'201805',
                'drform_target':'NPA'
               }

sql_data_sample = """select * 
                     from {0} 
                     where dt = %(date_to)s 
                     and {1} in (%(drform_target)s)
                     ----------------------------------------------------
                     union all
                     ----------------------------------------------------
                     (select * 
                      from {0} 
                      where dt  = %(date_from)s 
                      and {1} in ('ACT') 
                      order by random() limit 50000);"""

sql_data_sample = sql.SQL(sql_data_sample).format(sql.Identifier(table_name), 
                                                  sql.Identifier(col_name))

df_data_sample = pd.read_sql(sql_data_sample,con = cnxn,params = query_params)