I am trying to retrieve data from a MySQL database by sending a MySQL query using Python.
When I send the MySQL Query in MySQL workbench, it runs perfectly fine.
When I try the same using Python (in a Jupyter Notebook), it returns an error.
Python Code:
import pymysql import pandas as pd def run_mysql(SQLQ): conn = pymysql.connect(host='IP address', user='username', passwd='password', db='database name') df = pd.read_sql(SQLQ, conn) conn.close() return df mysql_query = '''set @Yesterday = curdate() -1 ; SELECT * FROM mt4_daily where date(time) = date(@Yesterday) ''' df = run_mysql(mysql_query) display(df)
Error:
DatabaseError: Execution failed on sql 'set @Yesterday = curdate() -1 ; SELECT * FROM mt4_daily where date(time) = date(@Yesterday) ': (1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT * FROM mt4_dailyn where date(time) = date(@Yesterday)' at line 2")
If I remove the variable in the MySQL Query it runs fine:
import pymysql import pandas as pd def run_mysql(SQLQ): conn = pymysql.connect(host='IP address', user='username', passwd='password', db='database name') df = pd.read_sql(SQLQ, conn) conn.close() return df mysqlquery = '''SELECT * FROM mt4_daily where date(time) = date(curdate() -1) ''' df = run_mysql(mysqlquery) display(df)
What am I doing wrong?
Final Solution:
Thank you Prashant Sharma for the solution.
I tweaked it a bit so it returns a pandas dataframe and allows for a list of variables to be passed prior to the Select query.
Here is the code:
import pymysql import pandas as pd def run_mysql(SQLQ,MySQL_Variable_List=''): try: conn = pymysql.connect(host='Server IP', user='UserName', passwd='Password', db='Database name') cursor = conn.cursor() for i in MySQL_Variable_List: cursor.execute(i) df = pd.read_sql(SQLQ, conn) except Exception as e: print(str(e)) finally: cursor.close() conn.close() return df MySQL_Variable_List = ["set @Yesterday = curdate() -1 ;"] SQLQ = "SELECT * FROM mt4_daily where date(time) = date(@Yesterday) limit 10" df1 = run_mysql(MySQL_Variable_List,SQLQ) display(df1)
Advertisement
Answer
The below code does the job, have tested it. You might have to rectify some indentation issue incase if something pops up.
import pymysql def run_mysql(query1, query2): try: conn = pymysql.connect(host='localhost', user='root', passwd='', db='data_new_es') cursor = conn.cursor() cursor.execute(query1) cursor.execute(query2) row = cursor.fetchone() print(row) except Exception as e: print(str(e)) finally: cursor.close() conn.close() mysqlquery1 = "set @Yesterday = curdate() -1 ;" mysqlquery2 = "select * from abcde where date(accrual_date) = date(@Yesterday)" df1 = run_mysql(mysqlquery1,mysqlquery2)