Python 在查询中使用pandas和命名参数读取mysql表

Python 在查询中使用pandas和命名参数读取mysql表,python,mysql,pandas,sqlalchemy,Python,Mysql,Pandas,Sqlalchemy,我尝试执行以下查询 SELECT user_id, user_agent_id, requests FROM riskanalysis_user_http_ua_stats WHERE since>= :since AND until< :until' pandas.read\u sql\u query希望在引擎之前执行sql查询,并尝试将查询解析为数据库URI。 看 根据, 参数:列表、元组或dict,可选,默认值:无 要传递给execute方法的参数列表。用于传递参数的语法取

我尝试执行以下查询

SELECT user_id, user_agent_id, requests 
FROM riskanalysis_user_http_ua_stats
WHERE since>= :since AND until< :until'

pandas.read\u sql\u query
希望在引擎之前执行
sql
查询,并尝试将查询解析为数据库URI。

根据,

参数:列表、元组或dict,可选,默认值:无

要传递给execute方法的参数列表。用于传递参数的语法取决于数据库驱动程序。检查数据库驱动程序文档,了解支持PEP 249的paramstyle中描述的五种语法样式中的哪一种。例如,对于psycopg2,使用%(name)s,因此使用params={'name':'value'}

如果你再看看,你会看到很多选择。但是美国

如果args是列表或元组,则可以在查询中将%s用作占位符

如果args是dict,%(name)s可以用作查询中的占位符

因此,适用于您的案例,即:

sql = 'SELECT user_id, user_agent_id, requests ' \
      'FROM riskanalysis_user_http_ua_stats ' \
      'WHERE since>= %s AND until< %s'

dataframe_records = pd.read_sql_query(sql, engine,
                                      params=(datetime_object, datetime_object))
sql='SELECT user\u id、user\u agent\u id、requests'\
'来自riskanalysis\u user\u http\u ua\u stats'\
'其中自>=%s至<%s'
dataframe\u records=pd.read\u sql\u查询(sql、引擎、,
参数=(日期时间对象,日期时间对象)

sql='SELECT user\u id、user\u agent\u id、requests'\
'来自riskanalysis\u user\u http\u ua\u stats'\
'其中自>=%(自)s至<%(至)s'
dataframe\u records=pd.read\u sql\u查询(sql、引擎、,
params={'since':datetime_对象,
“直到”:日期时间(对象})

如前所述,您的驱动程序无法识别使用冒号语法的命名占位符。查询按原样传递给MySQL,然后MySQL会抱怨占位符,因为它们是语法错误。解决方案是使用SQLAlchemy构造,它处理将命名占位符转换为驱动程序可以理解的格式:

from sqlalchemy import text

sql = text(sql)
dataframe_records = pd.read_sql_query(sql, engine,
                                      params={'since':datetime_object,
                                              'until':datetime_object})

一张小小的初学者便条,一开始就把我难住了。如果您只有一个参数,并且使用带有
(datetime\u对象,datetime\u对象)的方法
,则需要一个尾随逗号,即
(mySingleValue,)
sqlalchemy.exc.ProgrammingError: (pymysql.err.ProgrammingError) (1064, u"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 ':since AND until< :until' at line 1") [SQL: 'SELECT user_id, user_agent_id, requests FROM riskanalysis_user_http_ua_stats WHERE since>= :since AND until< :until'] [parameters: {'since': datetime.datetime(2015, 6, 18, 0, 0, tzinfo=tzutc()), 'until': datetime.datetime(2015, 6, 18, 0, 2, tzinfo=tzutc())}]
dataframe_records = pd.read_sql_query(sql, engine,
      params={'since':datetime_object,'until':datetime_object}
)
sql = 'SELECT user_id, user_agent_id, requests ' \
      'FROM riskanalysis_user_http_ua_stats ' \
      'WHERE since>= %s AND until< %s'

dataframe_records = pd.read_sql_query(sql, engine,
                                      params=(datetime_object, datetime_object))
sql = 'SELECT user_id, user_agent_id, requests ' \
      'FROM riskanalysis_user_http_ua_stats ' \
      'WHERE since>= %(since)s AND until< %(until)s'

dataframe_records = pd.read_sql_query(sql, engine,
                                      params={'since':datetime_object,
                                              'until':datetime_object})
from sqlalchemy import text

sql = text(sql)
dataframe_records = pd.read_sql_query(sql, engine,
                                      params={'since':datetime_object,
                                              'until':datetime_object})