pd.read_sql()知道这些就够用了

本文详细介绍了如何使用Pandas的read_sql函数从SQL数据库读取数据,包括参数解析、数据库连接创建方法及与read_sql_table、read_sql_query的区别。涵盖了SQLAlchemy和DBAPI两种数据库链接方式。
该文章已生成可运行项目,
pandas.read_sql(sql, con, index_col=None, coerce_float=True, params=None, parse_dates=None, columns=None, chunksize=None)
  • 各参数意义

    • sql:SQL命令字符串
    • con:连接sql数据库的engine,一般可以用SQLalchemy或者pymysql之类的包建立
    • index_col: 选择某一列作为index
    • coerce_float:非常有用,将数字形式的字符串直接以float型读入
    • parse_dates:将某一列日期型字符串转换为datetime型数据,与pd.to_datetime函数功能类似。可以直接提供需要转换的列名以默认的日期形式转换,也可以用字典的格式提供列名和转换的日期格式,比如{column_name: format string}(format string:"%Y:%m:%H:%M:%S")。
    • columns:要选取的列。一般没啥用,因为在sql命令里面一般就指定要选择的列了
    • chunksize:如果提供了一个整数值,那么就会返回一个generator,每次输出的行数就是提供的值的大小。
  • 设置参数can–>创建数据库链接的两种方式

  1. 用sqlalchemy构建数据库链接
import pandas as pd
import sqlalchemy
from sqlalchemy import create_engine

# 用sqlalchemy构建数据库链接engine
connect_info = 'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8'
engine = create_engine(connect_info)
# sql 命令
sql_cmd = "SELECT * FROM table"
df = pd.read_sql(sql=sql_cmd, con=engine)
  1. 用DBAPI构建数据库链接
import pandas as pd
import pymysql

# sql 命令
sql_cmd = "SELECT * FROM table"

# 用DBAPI构建数据库链接engine
con = pymysql.connect(host=localhost, user=username, password=password, database=dbname, charset='utf8', use_unicode=True)
df = pd.read_sql(sql_cmd, con)
  • read_sql与read_sql_table、read_sql_query

read_sql本质上是read_sql_table、read_sql_query的统一方式。

三者都return返回DataFrame。

  1. read_sql_table

Read SQL database table into a DataFrame.

  1. read_sql_query

Read SQL query into a DataFrame.

  • 参考

  1. read_sql()官方文档
  2. Arkenstone
  3. 编程之路

.
.
.
2019-01-22 21:37:52写于邹平

本文章已经生成可运行项目
<think>我们正在讨论的是pandas库中读取SQL数据的两个函数:`pd.read_sql_query`和`pd.read_sql`(注意:实际函数名为`read_sql`,但通常作为`pd`模块下的函数使用,所以调用形式为`pd.read_sql`)。根据引用内容,特别是引用[3]提到了`pandas read_sql`与`read_sql_table`、`read_sql_query`的区别,我们可以从中提取信息。 首先,需要明确的是: - `pd.read_sql_query`:用于执行SQL查询语句(如SELECT)并返回结果到DataFrame。 - `pd.read_sql_table`:用于读取整个数据库表(相当于SELECT * FROM table)到DataFrame。 - `pd.read_sql`:是一个更通用的函数,它可以根据提供的参数是表名还是查询语句,自动调用`read_sql_table`或`read_sql_query`。 因此,用户的问题可以转化为:`pd.read_sql_query`和`pd.read_sql`(注意函数名是`read_sql`)的区别。 具体分析如下: 1. **功能范围**: - `pd.read_sql_query`:只能执行查询语句(通常是SELECT语句),返回查询结果。 - `pd.read_sql`:可以执行查询语句,也可以直接读取表(通过表名)。它内部会根据输入是查询语句还是表名来决定使用`read_sql_query`还是`read_sql_table`。 2. **使用方式**: - 当使用`pd.read_sql`时,如果第一个参数是表名,则相当于调用`pd.read_sql_table`;如果第一个参数是SQL查询字符串,则相当于调用`pd.read_sql_query`。 - 因此,`pd.read_sql`可以看作是`read_sql_query`和`read_sql_table`的便捷封装。 3. **参数差异**: - `pd.read_sql_query`的参数: ```python pandas.read_sql_query(sql, con, index_col=None, coerce_float=True, params=None, parse_dates=None, chunksize=None) ``` 其中`sql`是查询字符串。 - `pd.read_sql`的参数: ```python pandas.read_sql(sql, con, index_col=None, coerce_float=True, params=None, parse_dates=None, columns=None, chunksize=None) ``` 注意:`pd.read_sql`多了一个`columns`参数(当第一个参数是表名时,可以通过`columns`指定要读取的列,但实际使用中较少用,通常直接写SQL查询更灵活),另外,它也可以接受表名作为第一个参数。 4. **使用示例**: - 使用`pd.read_sql_query`: ```python import pandas as pd import sqlalchemy engine = sqlalchemy.create_engine('sqlite:///mydatabase.db') query = "SELECT * FROM my_table WHERE condition" df = pd.read_sql_query(query, engine) ``` - 使用`pd.read_sql`执行查询(与上面相同): ```python df = pd.read_sql(query, engine) ``` - 使用`pd.read_sql`读取表(不需要写SQL语句): ```python df = pd.read_sql('my_table', engine) ``` 5. **选择建议**: - 如果你需要执行一个特定的SQL查询(尤其是复杂的JOIN或WHERE条件),使用`pd.read_sql_query`或`pd.read_sql`(传入SQL字符串)都可以。 - 如果你想直接读取整个表(没有条件),使用`pd.read_sql_table`或`pd.read_sql`(传入表名字符串)更简洁。 总结:`pd.read_sql_query`专门用于执行SQL查询,而`pd.read_sql`是一个更通用的函数,它可以根据输入自动选择执行查询还是读取整个表。在大多数情况下,使用`pd.read_sql`并传入SQL查询字符串,效果与`pd.read_sql_query`相同。 另外,引用[4]提到了中文字符乱码问题,这在两个函数中同样存在,解决方法通常是在创建数据库连接时指定正确的字符集(如`charset='utf8'`)。 最后,注意函数名:`pd.read_sql_query`和`pd.read_sql`(注意没有`pd_read_sql_query`这样的写法,都是`pd.read_sql_query`和`pd.read_sql`,即函数名中间有下划线,且是`read_sql`而不是`read_sql`拼写错误,但用户问题中写的是`pd_read_sql_query`和`pd_read_sql`,这可能是笔误,实际函数名是`read_sql_query`和`read_sql`,在pandas中通过`pd`模块调用)。 因此,在回答时,我们使用正确的函数名:`pd.read_sql_query`和`pd.read_sql`。</think>### `pd.read_sql_query` 与 `pd.read_sql` 的区别详解 在 Pandas 中,`pd.read_sql_query()` 和 `pd.read_sql()` 都是用于从数据库读取数据的函数,但它们在功能和使用场景上有重要区别: #### 1. **功能定位** - **`pd.read_sql_query()`** 专门用于执行 **SQL 查询语句**(如 `SELECT`),并将结果直接转换为 DataFrame。 示例: ```python import pandas as pd query = "SELECT name, age FROM users WHERE age > 30" df = pd.read_sql_query(query, connection) ``` - **`pd.read_sql()`** 是更通用的函数,可接受两种输入: ✅ **SQL 查询语句**(等同于 `read_sql_query`) ✅ **表名**(自动执行 `SELECT * FROM table`) 示例: ```python # 方式1:执行SQL查询(等效于read_sql_query) df1 = pd.read_sql("SELECT * FROM orders", connection) # 方式2:直接读取整张表 df2 = pd.read_sql("products", connection) # 无需写SQL语句 ``` #### 2. **参数差异 | 参数 | `read_sql_query` | `read_sql` | 说明 | |--------------|------------------|----------------|-----------------------------| | 第一参数 | 必须是SQL查询语句 | SQL语句或表名 | `read_sql` 更灵活 | | `columns` | ❌ 不支持 | ✅ 支持 | 仅当第一参数为表名时生效[^3] | | 表名直接读取 | ❌ 不支持 | ✅ 支持 | `read_sql` 的独有功能 | #### 3. **底层实现关系 $$ \text{read\_sql}(input, con) = \begin{cases} \text{read\_sql\_query}(input, con) & \text{if } input \text{ 是SQL语句} \\ \text{read\_sql\_table}(input, con) & \text{if } input \text{ 是表名} \end{cases} $$ #### 4. **使用场景对比 - **优先用 `read_sql_query` 当**: - 需要执行复杂查询(JOIN/子查询/聚合) - 只需读取表的部分列或过滤数据 ```python complex_query = """ SELECT u.name, COUNT(o.id) AS order_count FROM users u JOIN orders o ON u.id = o.user_id GROUP BY u.name """ df = pd.read_sql_query(complex_query, engine) ``` - **优先用 `read_sql` 当**: - 需要快速读取整张表(无需手动写SQL) - 代码需要兼容表名和SQL语句两种输入 ```python # 读取整张产品表(最简写法) products_df = pd.read_sql("products", engine) ``` #### 5. **字符编码问题 两者都可能遇到中文字符乱码(如引用[4]所述),解决方案相同: ```python # 创建连接时指定编码 engine = create_engine('mysql+pymysql://user:pass@host/db?charset=utf8mb4') # 读取时显式指定编码 df = pd.read_sql_query(query, engine, encoding='utf-8') ``` #### 总结对比表 | 特性 | `read_sql_query` | `read_sql` | |---------------------|------------------------|------------------------| | 输入类型 | 仅SQL查询语句 | SQL语句 **或** 表名 | | 读取整表 | 需写 `SELECT *` | 直接输入表名即可 | | 复杂查询支持 | ✅ 原生支持 | ✅ 支持 | | 自动选择列 | ❌ | ✅(通过 `columns` 参数)| | 适用场景 | 精确控制查询逻辑 | 快速读取或兼容不同输入 | > 📌 **实践建议**:大多数场景下使用 `pd.read_sql()` 更灵活,除非需要强制确保输入必须是SQL查询语句。
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值