当前位置:数码通 > 数码

如何将SQL查询结果转换为Pandas数据结构DataFrame?

来源于 数码通 2023-10-10 02:54

如何将SQL查询结果转换为PANDAS数据结构DataFrame?

简而言之,我想对 SQL 数据库运行查询并将返回的数据存储为 Pandas 数据结构。

我正在阅读有关 Pandas 的文档,但在识别查询的返回类型时遇到了困难。

我尝试打印查询结果,但没有得到任何有用的信息。查询码如下:

来自 sqlalchemy 导入 create_engine

engine2 = create_engine('mysql://我正在访问的数据库')
连接2 = 引擎2.connect()
数据ID=1022
resoverall = connection2.execute("
  选择
      总和(BLABLA) AS BLA,
      总和(BLABLABLA2) AS BLABLABLA2,
      总和(SOME_INT)作为 SOME_INT,
      总和(SOME_INT2)作为 SOME_INT2,
      100*总和(SOME_INT2)/总和(SOME_INT)作为ctr,
      总和(SOME_INT2)/总和(SOME_INT) AS cpc
   来自 daily_report_cooked
   WHERE Campaign_id = '%s'", %dataid)

如代码所示,我想了解变量“resoverall”的格式/数据类型是什么以及如何将其与PANDAS数据结构一起使用。

最好的方法

这是完成任务的最短代码:

从 pandas 导入 DataFrame
df = DataFrame(resoverall.fetchall())
df.columns = resoverall.keys()

下一个最好的事情

如下所述,Pandas 现在可以使用 SQLAlchemy 进行数据库读取 (read_sql) 和插入 (to_sql)。以下方法有效:

导入 pandas 作为 pd

df = m.smtshopping.cn_sql(sql, cnxn) # 让 cnxn = connection2

旧版本:

导入pyodbc
将 pandas.io.sql 导入为 psql

cnxn = pyodbc.connect(connection_info)
光标 = cnxn.cursor()
sql =“从表中选择*”

df = psql.frame_query(sql, cnxn)
cnxn.close()

第三种方法

在SQLAlchemy之外,如果我需要使用pyodbc、MySQLdb或psychopg2,像下面这样的简单函数通常可以满足我的需求:

导入小数

导入pydobc
将 numpy 导入为 np
进口熊猫

cnn, cur = myConnectToDBfunction()
cmd =“从我的表中选择*”
cur.执行(cmd)
数据框 = __processCursor(cur, 数据框=True)

def __processCursor(cur, dataframe=False, 索引=None):
    '''
    将带有数据的数据库游标处理为
    结构化 numpy 数组或 pandas 数据框。

    输入:
    cur - 刚刚接收数据的 pyodbc 游标数据框 - 布尔值。如果为 false,则返回一个 numpy 记录数组
                如果为 true,则返回 pandas 数据框
    index - 在 pandas 数据框中用作索引的列列表
    '''
    数据类型 = []
    colinfo = cur.描述
    对于 colinfo 中的 col:
        如果 col[1] == unicode:
            datatypes.append((col[0], 'U%d' % col[3]))
        elif col[1] == str:
            datatypes.append((col[0], 'S%d' % col[3]))
        elif col[1] in [float,decimal.Decimal]:
            datatypes.append((col[0], 'f4'))
        elif col[1] == datetime.datetime:
            datatypes.append((col[0], 'O4'))
        elif col[1] == int:
            datatypes.append((col[0], 'i4'))

    数据 = []
    对于 cur 中的行:
        data.append(元组(行))

    数组 = np.array(数据, dtype=数据类型)
    如果数据框:
        输出 = pandas.DataFrame.from_records(array)

        如果索引不是 None:输出 = 输出.set_index(索引)

    别的:
        输出=数组

    返回输出

 

第四种办法

对于mysql:

导入 pandas 作为 pd
导入 mysql.connector

# 设置MySQL连接
db = mysql.connector.connect(
    host="", # 你的主机,通常是 localhost
    user="", # 您的用户名
    密码=“”,#您的密码
    database="" # 数据库名称
)

# 您必须创建一个 Cursor 对象。它将让您执行您需要的所有查询
cur = db.cursor()

# 使用所有你喜欢的 SQL
cur.execute("SELECT * FROM ")

# 将其全部放入数据框中
sql_data = pd.DataFrame(cur.fetchall())
sql_data.columns = cur.column_names

# 关闭会话
db.close()

# 显示数据
打印(sql_data.head())

 

第五种方法

对于 SQL Server。

导入 pandas 作为 pd
从 sqlalchemy 导入 create_engine

def getData():# 参数
  服务器名称 =“我的服务器”
  数据库=“my_db”
  UserPwd = "用户:密码"
  驱动程序=“驱动程序=SQL Server Native Client 11.0”

  # 创建连接
  引擎 = create_engine('mssql+pyodbc://' + UserPwd + '@' + ServerName + '/' + 数据库 + "?" + 驱动程序)

  sql = "从 mytable 中选择*"
  df = m.smtshopping.cn_sql(sql, 引擎)
  返回df

df2 = 获取数据()
打印(df2)


参考资料

  • 如何将SQL查询结果转换为PANDAS数据结构?

 

登录后参与评论