Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python在尝试发送包含MySQL变量的MySQL查询时返回错误_Python_Mysql_Sql_Python 3.x - Fatal编程技术网

Python在尝试发送包含MySQL变量的MySQL查询时返回错误

Python在尝试发送包含MySQL变量的MySQL查询时返回错误,python,mysql,sql,python-3.x,Python,Mysql,Sql,Python 3.x,我试图通过使用Python发送一个MySQL查询来从MySQL数据库检索数据 当我在MySQL工作台中发送MySQL查询时,它运行得非常好 当我使用Python(在Jupyter笔记本中)尝试同样的方法时,它返回一个错误 Python代码: import pymysql import pandas as pd def run_mysql(SQLQ): conn = pymysql.connect(host='IP address', user='username', passwd='p

我试图通过使用Python发送一个MySQL查询来从MySQL数据库检索数据

当我在MySQL工作台中发送MySQL查询时,它运行得非常好

当我使用Python(在Jupyter笔记本中)尝试同样的方法时,它返回一个错误

Python代码:

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)
错误:

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_daily\n                where date(time) = date(@Yesterday)' at line 2")
如果我删除MySQL查询中的变量,它将正常运行:

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)
我做错了什么


最终解决方案:

谢谢你的解决方案

我对其进行了一些调整,使其返回一个数据帧,并允许在Select查询之前传递变量列表

代码如下:

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)


尝试将它们作为两个单独的查询运行

mysql_query = '''set @Yesterday = curdate() -1 ;'''
df = run_mysql(mysql_query)
mysql_query = '''SELECT * FROM mt4_daily
                where date(time) = date(@Yesterday)
                '''
df = run_mysql(mysql_query)

我认为这是因为有两条语句,这个函数只允许同时读取和执行一条语句。根据pandas,您可以使用read_sql“params”关键字参数来解决此问题,并将@Dayed值计算移动到python端:

import pymysql
import pandas as pd

from datetime import datetime, timedelta

def run_mysql(SQLQ, params):
    conn = pymysql.connect(host='IP address', user='username', passwd='password', db='database name')
    df = pd.read_sql(SQLQ, conn, params=params)
    conn.close()
    return df

mysqlquery = '''SELECT * FROM mt4_daily
                where date(time) = date(%(yesterday)s)
             '''
yesterday = datetime.date(datetime.now())- timedelta(days=1)
params = {'yesterday': yesterday}
df = run_mysql(mysqlquery, params)
display(df)

我无法执行代码,但我的想法是这样的。

下面的代码完成了这项工作,已经对其进行了测试。您可能需要纠正一些缩进问题,以防出现问题

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)

查询字符串中有一个换行符
\n
。尝试改用原始字符串文本(
r'
)。没用。相同的错误。这不起作用,也不会起作用,因为您向服务器发送了明显不同的查询。服务器无法知道@昨天在两者之间是连接的。谢谢你的帮助!是的,计算日期可以移动到Python端,它肯定会解决这个特殊的问题。然而,我正在尝试学习如何从Python发送MySQL变量,您的解决方案避免了这种情况。谢谢你的意见!工作起来很有魅力!