使用pandas和查询中的命名参数从mysql表中读取

Apo*_*los 3 python mysql sqlalchemy pandas

我尝试执行以下查询

SELECT user_id, user_agent_id, requests 
FROM riskanalysis_user_http_ua_stats
WHERE since>= :since AND until< :until'
Run Code Online (Sandbox Code Playgroud)

我尝试以下熊猫代码

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

dataframe_records = pd.read_sql_query(sql, engine,
                                      params={'since':datetime_object,
                                              'until':datetime_object}
Run Code Online (Sandbox Code Playgroud)

我收到以下错误

sqlalchemy.exc.ArgumentError: Could not parse rfc1738 URL from string 'SELECT user_id, user_agent_id, requests FROM riskanalysis_user_http_ua_stats WHERE since>= :since AND until< :until'
Run Code Online (Sandbox Code Playgroud)

pymysql用作驱动程序和 MySQL 数据库。如何在 sql 查询中传递命名参数?

编辑 1:更正了参数顺序,但现在我得到以下信息

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())}]
Run Code Online (Sandbox Code Playgroud)

Gui*_*ini 5

根据pandas.read_sql_query 文档

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

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

如果您随后查看PEP 249 的 paramstyle,您会看到许多选项。但是PyMySQL 的execute文档指出

如果 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))
Run Code Online (Sandbox Code Playgroud)

或者

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})
Run Code Online (Sandbox Code Playgroud)