当需要读取数据库中数据的时候,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和gender
为male
的记录。为了查询数据时传递参数,我们使用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查询语句,查询了products
、order_items
和orders
三个表中的数据,并进行了关联、分组、聚合、过滤和排序等操作。在SQL查询语句中,我们使用了三个?号占位符,表示查询的起始时间、结束时间和数量限制。在params
参数中,我们设置了查询参数,依次为"2021-01-01"
、"2021-03-31"
和50
,查询了2021年1月1日至3月31日之间总销量超过50的商品数据,并按销售金额和销售数量排序。