Python中使用pandas读取数据库SQL数据
在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方式,因为它提供了更好的兼容性和更多的功能选项。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)