【问题标题】:How to store mySQL query result into pandas DataFrame with pymysql?如何使用 pymysql 将 mySQL 查询结果存储到 pandas DataFrame 中?
【发布时间】:2018-04-29 22:00:58
【问题描述】:

我正在尝试使用 pymysql 将 mySQL 查询结果存储在 pandas DataFrame 中,并且在构建数据框时遇到错误。发现了一个类似的问题herehere,但似乎有pymysql 特定的错误被抛出:

import pandas as pd
import datetime
import pymysql

# dummy values 
connection = pymysql.connect(user='username', password='password', databse='database_name', host='host')

start_date = datetime.datetime(2017,11,15)
end_date = datetime.datetime(2017,11,16)

try:
    with connection.cursor() as cursor:
    query = "SELECT * FROM orders WHERE date_time BETWEEN %s AND %s"

    cursor.execute(query, (start_date, end_date)) 

    df = pd.DataFrame(data=cursor.fetchall(), index = None, columns = cursor.keys())
finally:
    connection.close()

返回:AttributeError: 'Cursor' object has no attribute 'keys'

如果我放弃 indexcolumns 参数:

try:
    with connection.cursor() as cursor:
    query = "SELECT * FROM orders WHERE date_time BETWEEN %s AND %s"

    cursor.execute(query, (start_date, end_date)) 

    df = pd.DataFrame(cursor.fetchall())
finally:
    connection.close()

返回ValueError: DataFrame constructor not properly called!

提前致谢!

【问题讨论】:

    标签: python mysql pandas pymysql


    【解决方案1】:

    为此使用Pandas.read_sql()

    query = "SELECT * FROM orders WHERE date_time BETWEEN ? AND ?"
    df = pd.read_sql(query, connection,  params=(start_date, end_date))
    

    【讨论】:

    • pandas.read_sql() 通常运行良好。但是,如果命令是执行需要更新表(并提交表的更新行)的存储过程怎么办?在那种情况下,如何确保提交完成? pd.read_sql 是否允许提交?
    • @Nodame,您可以先使用 sqlalchemy 调用存储过程,然后使用 pd.read_sql 读取结果
    • 由于 pymysql Connection 不继承自任何 schlalchemy 类,pymysql 连接如何与 pandas read_sql 一起工作?
    【解决方案2】:

    试试这个:

    import pandas as pd
    import pymysql
    
    mysql_connection = pymysql.connect(host='localhost', user='root', password='', db='test', charset='utf8')
                        
    sql = "SELECT * FROM `brands`"
    df = pd.read_sql(sql, mysql_connection, index_col='brand_id')
    print(df)
    

    【讨论】:

      【解决方案3】:

      感谢您建议使用 pandas.read_sql()。它也适用于执行存储过程!我在 MSSQL 2017 环境下测试过。

      下面是一个例子(希望对其他人有所帮助):

      def database_query_to_df(connection, stored_proc, start_date, end_date):
          # Define a query
          query ="SET NOCOUNT ON; EXEC " + stored_proc + " ?, ? " + "; SET NOCOUNT OFF"
      
          # Pass the parameters to the query, execute it, and store the results in a data frame
          df = pd.read_sql(query, connection, params=(start_date, end_date))
          return df
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-02-28
        • 1970-01-01
        • 1970-01-01
        • 2023-03-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-06
        相关资源
        最近更新 更多