2017-10-20 19 views
1

Nouveau à python et pandas géants, Im face à la question suivante:Comment insérer plusieurs ID dans une instruction SQL?

Je voudrais passer chaîne multiples dans une requête SQL et de la lutte pour insérer le séparateur « »:

Example data 

import pandas as pd 

data = [['Alex',10],['Bob',12],['Clarke',13]] 
df = pd.DataFrame(data,columns=['Name','Age']) 
print (df) 

# Remove header (Not sure whether that is necessary) 
df.columns = df.iloc[0] 


pd.read_sql(

    """ 
SELECT 
* 

FROM emptable 
WHERE empID IN ('{}',) 

    """.format(df.ix[:, 0]), # Which corresponds to 'Alex','Bob','Clarke' 

    con = connection) 

J'ai essayé différentes combinaisons Cependant, aucun d'eux n'a fonctionné.

Répondre

2

Démo:

sql_ = """ 
SELECT * 
FROM emptable 
WHERE empID IN ({}) 
""" 

sql = sql_.format(','.join([x for x in ['?'] * len(df)])) 
print(sql) 

new = pd.read_sql(query, conn, params=tuple(df['Name'])) 

Sortie:

In [166]: print(sql) 

SELECT * 
FROM emptable 
WHERE empID IN (?,?,?) 

NOTE: cette approche ne fonctionnera pas si votre DF est grande, car la chaîne SQL généré serait trop grand.

Dans ce cas, vous pouvez sauvegarder/vider les noms dans une table temporaire d'aide et de l'utiliser dans SQL:

df[['Name']].to_sql('tmp', conn, if_exists='replace') 

sql = """ 
SELECT * 
FROM emptable 
WHERE empID IN (select Name from tmp) 
""" 
new = pd.read_sql(sql, conn) 
+0

Merci pour votre réponse. Comment pouvez-vous vous assurer que «Alex», «Bob», «Clarke» sont passés en tant que chaînes. Droit sais que votre code ne comprend pas de citations explicites. Au moins c'est la syntaxe pour mysql si vous passez une chaîne. – Mamba

+0

@Mamba, vous n'avez pas à - ce sera fait pour vous automatiquement – MaxU