Función Pandas pd.read_sql()

Python math 模块Funciones comunes de Pandas


read_sql()Es una función de la biblioteca pandas que se utiliza para leer datos de bases de datos, compatible con consultas SQL y la lectura directa de tablas de bases de datos.

Las bases de datos son componentes centrales de las aplicaciones empresariales, almacenando grandes cantidades de datos comerciales.read_sql()Puede conectarse a varios tipos de bases de datos (como MySQL, PostgreSQL, SQLite, etc.), ejecutar consultas SQL y convertir los resultados en un DataFrame, facilitando el posterior análisis y procesamiento de datos.


Sintaxis básica y parámetros

Formato de sintaxis

pandas.read_sql(sql, con, index_col=None, coerce_float=True, params=None,
                parse_dates=None, chunksize=None, dtype=None, ...)

Descripción de parámetros

ParámetroTipoDescripciónValor predeterminado
sqlstr o SQLAlchemy SelectableSentencia de consulta SQL o nombre de tablaObligatorio
consqlalchemy engine, o conexión sqlite3Objeto de conexión a la base de datosObligatorio
index_colstr, list of strNombre de la columna utilizada como índice de filasNone
coerce_floatboolSi se intenta convertir cadenas numéricas en números de punto flotanteTrue
paramslist, tuple, dictParámetros de la consulta SQL parametrizadaNone
parse_dateslist, dictColumnas que deben analizarse como fechasNone
chunksizeintTamaño del iterador devuelto por bloquesNone

Valor de retorno

  • Tipo de retorno:pd.DataFrameo Iterator[DataFrame]
  • CuandochunksizeCuando es None, devuelve un único DataFrame.
  • Cuando se establecechunksizedevuelve un iterador, cada iteración devuelve un DataFrame.

Ejemplos

A través de los siguientes ejemplos, domine completamenteread_sql()los diversos usos de.

Ejemplo 1: Uso de la base de datos SQLite

SQLite es una base de datos embebida y ligera que no requiere un servidor de base de datos independiente, muy adecuada para el aprendizaje y las pruebas.

Ejemplo

import pandas as pd
import sqlite3

# Crear una base de datos SQLite en memoria e insertar datos de prueba
conn = sqlite3.connect(':memory:')

# Crear la tabla e insertar datos
cursor = conn.cursor()

# Crear tabla de empleados
cursor.execute('''
    CREATE TABLE employees (
        id INTEGER PRIMARY KEY,
        name TEXT NOT NULL,
        age INTEGER,
        city TEXT,
        salary INTEGER
    )
'''
)

# Insertar datos de prueba
employees_data = [
    (1, 'Tom', 28, 'Beijing', 8000),
    (2, 'Jerry', 35, 'Shanghai', 12000),
    (3, 'Mike', 42, 'Guangzhou', 15000),
    (4, 'Lucy', 26, 'Shenzhen', 7000),
    (5, 'John', 31, 'Beijing', 9500)
]

cursor.executemany('INSERT INTO employees VALUES (?, ?, ?, ?, ?)', employees_data)
conn.commit()

# Ejemplo 1a: Ejecutar consulta SQL y leer datos
# sql: Sentencia de consulta SQL (obligatorio)
# con: Objeto de conexión a la base de datos (obligatorio)
query = "SELECT name, age, city, salary FROM employees WHERE salary > 8000"
df_query = pd.read_sql(query, conn)
print("Ejecutar consulta SQL:")
print(df_query)
print()

# Ejemplo 1b: Leer toda la tabla directamente
# Se puede usar el nombre de la tabla como parámetro sql
df_table = pd.read_sql('employees', conn)
print("Leer toda la tabla:")
print(df_table)
print()

# Ejemplo 1c: Usar index_col para establecer el índice
df_indexed = pd.read_sql('employees', conn, index_col='id')
print("Establecer columna de índice:")
print(df_indexed)

Resultado esperado de la ejecución:

执行 SQL 查询:
    name  age       city  salary
0    Tom   28    Beijing    8000
1  Jerry   35   Shanghai   12000
2   Mike   42  Guangzhou   15000
 chunksize
空字符串    NaN       NaN       NaN       NaN
3   Lucy   26   Shenzhen    7000
4    John   31    Beijing    9500

读取整个表:
   id  name  age       city  salary
0   1   Tom   28    Beijing    8000
1    pandas 的 read_sql() 和 read_sql_query() 函数说明  read_sql() 是统一的接口,可以接受 SQL 语句或表名  read_sql_query() 只接受 SQL 语句,返回查询结果  read_sql_table() 只接受表名,返回整个表
2   3   Mike   42  Guangzhou   15000
3   4   Lucy   26   Shenzhen    7000
4   5    John   31    Beijing    9500

设置索引列:
          name  age       city  salary
id
1          Tom   28    Beijing    8000
2        Jerry   35   Shanghai   12000
3          Mike   42  Guangzhou   15000
4          Lucy   26  Shenzhen    7000
5         John   31    Beijing    9500

Análisis del código:

  • read_sql()Acepta una sentencia de consulta SQL como primer parámetro.
  • conEl parámetro con requiere un objeto de conexión a la base de datos, que puede ser una conexión de sqlite3, SQLAlchemy, etc.
  • Se puede pasar directamente el nombre de la tabla para leer los datos de toda la tabla.
  • index_colEl parámetro index_col puede especificar una columna como índice de filas.

Ejemplo 2: Conexión a la base de datos con SQLAlchemy

SQLAlchemy es el framework ORM más popular en Python y admite la conexión a múltiples bases de datos.

Ejemplo

import pandas as pd
from sqlalchemy import create_engine, text

# Usar SQLAlchemy para crear una base de datos SQLite en memoria
engine = create_engine('sqlite:///:memory:')

# Crear datos de prueba
with engine.connect() as conn:
    # Crear tabla de productos
    conn.execute(text('''
        CREATE TABLE products (
            id INTEGER PRIMARY KEY,
            name TEXT NOT NULL,
            category TEXT,
            price REAL,
            stock INTEGER
        )
    '''
))

    # Insertar datos
    products_data = [
        ('A', 'Electronics', 999.99, 50),
        ('B', 'Electronics', 499.99, 100),
        ('C', 'Clothing', 29.99, 200),
        ('D', 'Food', 5.99, 500),
        ('E', 'Books', 19.99, 150)
    ]

    conn.execute(text('''
        INSERT INTO products (name, category, price, stock) VALUES (?, ?, ?, ?)
    '''
), products_data)
    conn.commit()

# Ejemplo 2a: Usar el motor de SQLAlchemy para leer datos
query = "SELECT * FROM products WHERE category = :category"
df_params = pd.read_sql(
    query,
    engine,
    params={'category': 'Electronics'}  # Consulta parametrizada para prevenir la inyección SQL
)
print("Usar consulta parametrizada:")
print(df_params)
print()

# Ejemplo 2b: Leer directamente usando el nombre de la tabla
df_all = pd.read_sql('products', engine)
print("Leer toda la tabla:")
print(df_all)
print()

# Ejemplo 2c: Probar otras conexiones de base de datos (con MySQL como ejemplo)
# Nota: Se debe instalar el controlador de base de datos correspondiente
# pip install pymysql  # MySQL
# pip install psycopg2  # PostgreSQL

# Ejemplo de conexión MySQL
# engine_mysql = create_engine('mysql+pymysql://username:password@host/database')
# df_mysql = pd.read_sql('SELECT * FROM table_name', engine_mysql)

print("Nota: Conectarse realmente a MySQL/PostgreSQL requiere instalar el controlador correspondiente")

Resultado esperado de la ejecución:

使用参数化查询:
   id  name     category   price  stock
0   1      A  Electronics  999.99     50
 的 read_sql() 配对    write_frame() 已弃用,使用 to_sql() 方法替代  to_sql() 可以将 DataFrame 写入数据库表
2   2      B  Electronics  499.99    100

读取整个表:
   id  名称       类别    价格    库存
0   1      A  Electronics  999.99     50
1   2      B  ...  读取    499. 参数     100
2   3      C  Clothing     29.99     200
3   4      配对    Food       5.99    500
4   5      E  Books       19.99    150

Análisis del código:

  • SQLAlchemy proporciona una interfaz unificada de conexión a bases de datos, compatible con MySQL, PostgreSQL, Oracle y otras bases de datos.
  • paramsEl parámetro params se utiliza para consultas parametrizadas, lo que puede prevenir ataques de inyección SQL.
  • Usando la función de SQLAlchemycreate_engine()para crear el motor de la base de datos.

Ejemplo 3: Lectura por bloques y procesamiento de datos masivos

Cuando el volumen de datos del resultado de la consulta es muy grande, se puede leer por bloques para ahorrar memoria.

Ejemplo

import pandas as pd
import sqlite3

# Crear una gran cantidad de datos de prueba
conn = sqlite3.connect('test_large.db')
cursor = conn.cursor()

# Crear tabla
cursor.execute('''
    CREATE TABLE large_table (
        id INTEGER PRIMARY KEY,
        value INTEGER,
        category TEXT
    )
'''
)

# Insertar 10000 registros de datos de prueba
import random
large_data = [(i, random.randint(1, 1000), random.choice(['A', 'B', 'C']))
              for i in range(1, 10001)]
cursor.executemany('INSERT INTO large_table VALUES (?, ?, ?)', large_data)
conn.commit()

# Ejemplo 3a: Leer datos por bloques
# El parámetro chunksize especifica cuántas filas devolver cada vez
print("Leer datos por bloques:")
chunks = pd.read_sql('SELECT * FROM large_table', conn, chunksize=2000)

# Usar un generador para procesar cada bloque
for i, chunk in enumerate(chunks):
    print(f"Bloque {i+1}: {len(chunk)} filas")
    print(f" Cantidad de category='A' en este bloque: {len(chunk[chunk['category'] == 'A'])}")
print()

# Ejemplo 3b: Cálculo de agregación (combinar todos los bloques)
# Si se necesitan estadísticas globales, se pueden combinar todos los bloques
all_chunks = []
chunks = pd.read_sql('SELECT category, SUM(value) as total FROM large_table GROUP BY category',
                     conn, chunksize=1000)
for chunk in chunks:
    all_chunks.append(chunk)

# Combinar resultados
result = pd.concat(all_chunks, ignore_index=True)
print("Resultado de agregación:")
print(result)
print()

# Cerrar conexión
conn.close()

# Limpiar archivos de prueba
import os
os.remove('test_large.db')
print(La base de datos de prueba ha sido limpiada)

Resultado esperado de la ejecución:

分块读取数据:
Fragmento 1: 2000 行
块 读取    category='A' 的数据
...
块 5: 2000 行
  该块 category='A' 的数量: 约 667 行

聚合结果:
     category      total
0         A   1687500
1         B   1678250
2         Chunks    读取    约 665 行

Análisis del código:

  • chunksizeEl parámetro devuelve un iterador, y cada iteración devuelve un DataFrame.
  • La lectura por bloques es adecuada para conjuntos de datos grandes y puede evitar el problema de memoria insuficiente.
  • Para consultas de agregación, se puede usarpd.concat()para combinar los resultados de todos los bloques.

Notas

  • Usarread_sql()requiere instalar el controlador de base de datos correspondiente.
  • SQLite no requiere instalación adicional, se puede usar directamente.
  • MySQL requierepymysqlomysql-connector-python:pip install pymysql。
  • PostgreSQL requierepsycopg2:pip install psycopg2。
  • Usar consultas parametrizadas (paramsparámetro) puede prevenir ataques de inyección SQL.
  • Al leer tablas grandes, usar elchunksizeparámetro para lectura por bloques.

Resumen

read_sql()Es la función central de pandas para conectarse a bases de datos y leer datos. Puede ejecutar cualquier consulta SQL y convertir los resultados al formato DataFrame.

En el trabajo real de análisis de datos, las bases de datos son el método central de almacenamiento de datos empresariales. Dominarread_sql()permite obtener datos directamente de la base de datos para su análisis. Preste atención al uso de consultas parametrizadas para garantizar la seguridad y al uso de la lectura por bloques para procesar conjuntos de datos grandes.

Python math 模块Funciones comunes de Pandas

Otras extensiones