在Python中使用pandas读取数据库SQL数据有多种方法,以下是几种常见的方式:

1. 使用SQLAlchemy(推荐)

这是最通用和推荐的方法,支持多种数据库。

import pandas as pdfrom sqlalchemy import create_engine

# 创建数据库连接引擎# 格式:数据库类型+驱动://用户名:密码@主机:端口/数据库名

engine = create_engine('mysql+pymysql://username:password@localhost:3306/dbname')

# 读取SQL查询结果到DataFrame

query = "SELECT * FROM table_name WHERE condition"

df = pd.read_sql(query, engine)

# 或者读取整个表

df = pd.read_sql_table('table_name', engine)

# 或者使用SQL表达式

df = pd.read_sql_query('SELECT * FROM table_name', engine)

2. 使用特定数据库的连接器

MySQL示例

import pandas as pdimport pymysql

# 创建数据库连接

connection = pymysql.connect(

    host='localhost',

    user='username',

    password='password',

    database='dbname',

    charset='utf8mb4')

# 读取数据

df = pd.read_sql('SELECT * FROM table_name', connection)

# 关闭连接

connection.close()

PostgreSQL示例

import pandas as pdimport psycopg2

# 创建数据库连接

connection = psycopg2.connect(

    host='localhost',

    user='username',

    password='password',

    database='dbname')

df = pd.read_sql('SELECT * FROM table_name', connection)

connection.close()

SQLite示例

import pandas as pdimport sqlite3

# 创建数据库连接

connection = sqlite3.connect('database.db')

df = pd.read_sql('SELECT * FROM table_name', connection)

connection.close()

3. 使用环境变量管理数据库连接信息

python

复制下载

import pandas as pdfrom sqlalchemy import create_engineimport osfrom dotenv import load_dotenv

# 加载环境变量

load_dotenv()

# 从环境变量获取数据库配置

db_config = {

    'host': os.getenv('DB_HOST'),

    'user': os.getenv('DB_USER'),

    'password': os.getenv('DB_PASSWORD'),

    'database': os.getenv('DB_NAME'),

    'port': os.getenv('DB_PORT', 3306)}

# 创建连接

engine = create_engine(f"mysql+pymysql://{db_config['user']}:{db_config['password']}@{db_config['host']}:{db_config['port']}/{db_config['database']}")

# 读取数据

df = pd.read_sql('SELECT * FROM table_name', engine)

4. 带参数的查询(防止SQL注入)

import pandas as pdfrom sqlalchemy import create_engine

engine = create_engine('mysql+pymysql://user:password@localhost/dbname')

# 使用参数化查询

query = "SELECT * FROM users WHERE age > :age_limit AND country = :country"

params = {'age_limit': 18, 'country': 'China'}

df = pd.read_sql(query, engine, params=params)

5. 分块读取大数据集

python

复制下载

import pandas as pdfrom sqlalchemy import create_engine

engine = create_engine('mysql+pymysql://user:password@localhost/dbname')

# 分块读取大数据集

chunk_size = 10000

chunks = []

for chunk in pd.read_sql('SELECT * FROM large_table', engine, chunksize=chunk_size):

    # 处理每个数据块

    processed_chunk = chunk.dropna()  # 示例处理

    chunks.append(processed_chunk)

# 合并所有块

df = pd.concat(chunks, ignore_index=True)

6. 完整的示例代码

import pandas as pdfrom sqlalchemy import create_engineimport matplotlib.pyplot as plt

def read_sql_to_dataframe():

    # 数据库连接配置

    db_url = 'mysql+pymysql://user:password@localhost:3306/company_db'

    

    try:

        # 创建数据库引擎

        engine = create_engine(db_url)

        

        # 执行SQL查询

        query = """

        SELECT

            department,

            AVG(salary) as avg_salary,

            COUNT(*) as employee_count

        FROM employees

        WHERE hire_date > '2020-01-01'

        GROUP BY department

        ORDER BY avg_salary DESC

        """

        

        # 读取数据到DataFrame

        df = pd.read_sql(query, engine)

        

        print("数据读取成功!")

        print(f"数据形状: {df.shape}")

        print("\n前5行数据:")

        print(df.head())

        

        return df

        

    except Exception as e:

        print(f"数据库连接或查询错误: {e}")

        return None

# 使用函数

df = read_sql_to_dataframe()

if df is not None:

    # 进行数据分析

    df.plot(kind='bar', x='department', y='avg_salary')

    plt.title('各部门平均薪资')

    plt.show()

安装所需的库

bash

复制下载

# 对于MySQL

pip install pandas sqlalchemy pymysql

# 对于PostgreSQL

pip install pandas sqlalchemy psycopg2-binary

# 对于SQL Server

pip install pandas sqlalchemy pyodbc

# 对于SQLite(Python内置,无需安装额外包)

注意事项

安全性:不要在代码中硬编码数据库密码,使用环境变量或配置文件

连接管理:确保及时关闭数据库连接

性能:对于大数据集,考虑使用分块读取

错误处理:添加适当的异常处理机制

数据类型:pandas会自动推断数据类型,但有时可能需要手动指定

推荐使用SQLAlchemy方式,因为它提供了更好的兼容性和更多的功能选项。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐