【发布时间】:2020-02-06 16:20:31
【问题描述】:
我正在尝试通过使用 Python 发送 MySQL 查询来从 MySQL 数据库中检索数据。
当我在 MySQL 工作台中发送 MySQL 查询时,它运行得非常好。
当我使用 Python(在 Jupyter Notebook 中)尝试相同的操作时,它会返回错误。
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 Query 中的变量,它运行良好:
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)
我做错了什么?
最终解决方案:
感谢Prashant Sharma 的解决方案。
我对其进行了一些调整,使其返回一个 pandas 数据帧,并允许在 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)
【问题讨论】:
-
查询字符串中有一个换行符
\n。尝试使用原始字符串文字 (r'''<query>''') -
试过了。没用。同样的错误。
标签: python mysql sql python-3.x