pandas中read_sql使用参数进行数据查询的实现

  • Post category:Python

当需要读取数据库中数据的时候,pandas提供了read_sql()函数来完成。read_sql()函数比较强大,可以用来执行任何SQL查询,包括复杂的多表联查和存储过程调用,同时可以指定查询的列、过滤条件和排序规则等。在查询数据时,为了对数据进行更加精确的筛选,我们可以使用params参数来进行数据查询。

1. 基本用法

使用params参数,可以在执行SQL查询时传递参数,通常情况下这些参数值都是从程序输入或某个配置文件读取的。使用参数可以避免出现SQL注入攻击。下面是一个使用params参数的简单示例。

import pandas as pd
import sqlite3

# 连接SQLite数据库
conn = sqlite3.connect("test.db")

# 定义SQL查询语句,使用?号占位符表示参数
sql = "SELECT * FROM users WHERE age > ? AND gender = ?"

# 定义查询参数
params = (18, "male")

# 从数据库中读取数据到Pandas DataFrame
df = pd.read_sql(sql, conn, params=params)

# 打印DataFrame的前10行数据
print(df.head(10))

# 关闭数据库连接
conn.close()

在上面的例子中,我们定义了一个SQL查询语句,查询了users表中所有age大于18和gendermale的记录。为了查询数据时传递参数,我们使用params参数设置查询参数。在params参数中,第一个参数表示age的值,第二个参数表示gender的值,两个参数的顺序必须与SQL查询语句中的?号占位符顺序一致。

2. 复杂用法

在实际应用中,经常需要查询多个表的关联数据,并对数据进行聚合、过滤和排序等操作。下面是一个复杂查询的示例,展示了如何使用params参数查询复杂的跨表和汇总数据。

import pandas as pd
import sqlite3

# 连接SQLite数据库
conn = sqlite3.connect("sales.db")

# 定义复杂SQL查询语句
sql = """
SELECT 
    products.product_id, 
    products.name, 
    orders.order_date, 
    SUM(order_items.quantity) AS total_quantity,
    SUM(order_items.amount) AS total_amount
FROM 
    products 
    INNER JOIN order_items ON products.product_id = order_items.product_id
    INNER JOIN orders ON order_items.order_id = orders.order_id
WHERE 
    orders.order_date BETWEEN ? AND ?
GROUP BY 
    products.product_id, products.name, orders.order_date
HAVING 
    SUM(order_items.quantity) > ?
ORDER BY 
    total_amount DESC, total_quantity DESC
"""

# 定义查询参数
params = ("2021-01-01", "2021-03-31", 50)

# 从数据库中读取数据到Pandas DataFrame
df = pd.read_sql(sql, conn, params=params)

# 打印DataFrame的前10行数据
print(df.head(10))

# 关闭数据库连接
conn.close()

在上面的例子中,我们定义了一个SQL查询语句,查询了productsorder_itemsorders三个表中的数据,并进行了关联、分组、聚合、过滤和排序等操作。在SQL查询语句中,我们使用了三个?号占位符,表示查询的起始时间、结束时间和数量限制。在params参数中,我们设置了查询参数,依次为"2021-01-01""2021-03-31"50,查询了2021年1月1日至3月31日之间总销量超过50的商品数据,并按销售金额和销售数量排序。