2016-06-09 2 views
0

Ich versuche, eine Liste in die SQL-Abfrage über psycopg2 einzufügen, aber jedes Mal, es sehen ist ein "es es verdoppelt ...psycopg2 Python einfügen Liste

heres der Code:

for Line in ListFile: 
    if CountLigne == 1: 
     IDList = "'" + (Line[1].replace('"', '')) + "', " 
     CountLigne += 1 
    elif CountLigne < NbrLigne: 
     IDList += "'" + (Line[1].replace('"', '')) + "', " 
     CountLigne += 1 
    else: 
     IDList += (Line[1].replace('"', '') + "'") 

    break 
print(IDList) 
print(type(IDList)) 
FTDSQL = (
'''WITH ftd AS (
    SELECT m.event_user, m.event_ts, m.revenue, rank() OVER (PARTITION BY   m.event_user ORDER BY m.event_ts) as order_purchase 
    FROM agg_monetization m 
    WHERE revenue is not null 
) 
SELECT distinct ftd.event_user, SUM(ftd.revenue) 
FROM ftd 
WHERE order_purchase = 1 
AND ftd.event_user IN (%s) 
GROUP BY ftd.event_user, ftd.event_ts 
''' 
) 
Cursor.execute(FTDSQL, [IDList]) 
print(Cursor.query) 

die Liste: '849cf768-41ea-4ed0-9861-779369d3eede', '10ad8dca-b4e6-4be5-93d3-b7fb88b1668a'

das Ergebnis: und ftd.event_user IN ('' 849cf768-41ea-4ed0-9861-779369d3eede ' '', '' 10ad8dca-b4e6-4be5-93d3-b7fb88b1668a '', '' 863c3eaf-d98d-4f6a-bb97-8756750e7a09 ''

Danke !!

+0

Aber die Liste ist lang und 2964 wird jedes Mal wenn ich tun .. die Abfrage ändern, wie ich das beheben kann? – MathLal

Antwort

0

Pyscopg2 konvertiert Tupel automatisch in SQL-Liste. Werfen Sie einen Blick auf Adaptation of Python values to SQL types. Sie müssen also nur die Liste in Tupel ändern und dann übergeben.

FTDSQL = ''' 
    WITH ftd AS (
    SELECT 
     m.event_user, m.event_ts, m.revenue, 
     rank() OVER (PARTITION BY m.event_user ORDER BY m.event_ts) as order_purchase 
    FROM agg_monetization m 
    WHERE revenue is not null 
) 
    SELECT 
    distinct ftd.event_user, SUM(ftd.revenue) 
    FROM ftd 
    WHERE 
    order_purchase = 1 
    AND 
    ftd.event_user IN %s 
    -- parenthesis should be added automatically 
    GROUP BY ftd.event_user, ftd.event_ts 
''' 
) 
Cursor.execute(FTDSQL, (tuple(IDList),)) 

btw auf der anderen Seite Python-Listen sind standardmäßig auf Postgres ARRAY umgewandelt

+0

Es hat funktioniert! Vielen Dank – MathLal