2017-10-11 5 views
0

Il s'agit d'une question simple à laquelle je n'ai pas trouvé de réponse. J'ai un fichier .SQL avec deux commandes. J'aimerais que les Pandas tirent le résultat de ces commandes dans un DataFrame.Lecture d'un fichier SQL externe dans une base de données Pandas

Les commandes du fichier SQL sont en tant que telles, avec la requête la plus longue utilisant la date du jour.

SET @todaydate = DATE(NOW()); 
SELECT ...long query....; 

J'ai essayé d'utiliser read_sql de la façon suivante après avoir établi ma connexion (prod_db) et le message d'erreur « objet » NoneType « est pas itérables »

sqlpath = 'path.sql' 
scriptFile = open(sqlpath,'r') 
script = scriptFile.read() 
df = pd.read_sql(script,prod_db) 

J'ai aussi essayé d'utiliser la fonction et l'approche décrites ici reading external sql script in python mais je ne sais pas comment obtenir le résultat dans un cadre de données pandas (ou peut-être qu'il me manque quelque chose). Il ne semble pas lire les résultats car je reçois plusieurs fois la commande "Commandé".

def executeScriptsFromFile(filename): 
    fd = open(filename, 'r') 
    sqlFile = fd.read() 
    fd.close() 
    # all SQL commands (split on ';') 
    sqlCommands = sqlFile.split(';') 
    # Execute every command from the input file 
    for command in sqlCommands: 
     try: 
      c.execute(command) 
     except OperationalError, msg: 
      print "Command skipped: ", msg 
df = executescriptsfromfile(sqlpath) 

Répondre

2

J'ai une solution qui pourrait fonctionner pour vous. Il devrait vous donner un joli petit pandas.DataFrame.

D'abord, vous devez lire la requête dans le fichier sql. Ensuite, il suffit d'utiliser la pd.read_sql_query() au lieu de pd.read_sql()

Je suis sûr que vous le savez, mais voici la doc pour la fonction: http://pandas.pydata.org/pandas-docs/version/0.20/generated/pandas.read_sql_query.html#pandas.read_sql_query

# Read the sql file 
query = open('filename.sql', 'r') 

# connection == the connection to your database, in your case prob_db 
DF = pd.read_sql_query(query.read(),connection) 

je peux vous assurer qu'il fonctionne avec T-SQL, mais Je ne l'ai jamais utilisé avec MySQL.