Skip to content
Advertisement

Python return error when trying to send a MySQL query that contains MySQL variables

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)
User contributions licensed under: CC BY-SA
9 People found this is helpful
Advertisement