Python在尝试发送包含MySQL变量的MySQL查询时返回错误
我试图通过使用Python发送一个MySQL查询来从MySQL数据库检索数据 当我在MySQL工作台中发送MySQL查询时,它运行得非常好 当我使用Python(在Jupyter笔记本中)尝试同样的方法时,它返回一个错误 Python代码: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
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变量,您的解决方案避免了这种情况。谢谢你的意见!工作起来很有魅力!