前言
大家好!今天我们来聊聊Python连接数据库的那些事儿。无论是数据分析师、开发工程师还是数据科学家,掌握Python连接数据库的技能都是必备的。让我们一起探索如何用Python优雅地连接各种数据库,并高效地读取数据!
为什么选择Python连接数据库?
想象一下这些场景:
公司数据分散在MySQL、PostgreSQL、SQL Server等不同数据库中
如果每次都手动操作,不仅效率低下,还容易出错。而掌握了Python数据库连接技术,这些问题都能轻松解决!
1. 准备工作:安装必要的库
在开始之前,我们先安装一些基础库:
# 基础必备pip install pandas sqlalchemy# 根据需要选择数据库驱动pip install mysqlclient # MySQLpip install psycopg2 # PostgreSQLpip install pyodbc # SQL Serverpip install cx_Oracle # Oracle
2. 各种数据库连接实战
2.1 MySQL:最常用的关系型数据库
from sqlalchemy import create_engineimport pandas as pd# 连接MySQLengine = create_engine('mysql+pymysql://用户名:密码@主机:3306/数据库名')# 查询数据query = "SELECT * FROM users WHERE age > 25"df = pd.read_sql(query, engine)# 看看前5行数据print(df.head())
2.2 PostgreSQL:强大的开源数据库
# 连接PostgreSQLengine = create_engine('postgresql://用户名:密码@主机:5432/数据库名')# 复杂查询query = """SELECT u.name, u.email, COUNT(o.id) as order_countFROM users uLEFT JOIN orders o ON u.id = o.user_idWHERE u.active = TRUEGROUP BY u.id, u.name, u.emailHAVING COUNT(o.id) > 5"""df = pd.read_sql(query, engine)
2.3 SQL Server:企业级数据库
# 连接SQL Serverengine = create_engine('mssql+pymssql://用户名:密码@主机:端口/数据库名?charset=GBK')df = pd.read_sql("SELECT * FROM employees", engine)
2.4 Oracle:关系型数据库
# 连接Oracle# 连接字符串格式:oracle://用户名:密码@主机:端口/服务名engine = create_engine('oracle://用户名:密码@主机:端口/服务名')# 查询数据df = pd.read_sql("SELECT * FROM employees", engine)
3.使用INI文件管理数据库配置(重点!)
在实际项目中,我们不应该在代码中硬编码数据库密码。最好的做法是使用配置文件!
3.1 创建配置文件
创建一个名为config.ini的文件:
; config.ini; 数据库配置[mysql_prod]host = 192.168.1.100port = 3306database = company_dbusername = read_userpassword = secure_password_123[mysql_dev]host = localhostport = 3306database = dev_dbusername = dev_userpassword = dev_password[postgres_analytics]host = analytics.example.comport = 5432database = analytics_dbusername = analystpassword = analyst_pass[redis_cache]host = 127.0.0.1port = 6379password = redis_pass
3.2 Python读取INI配置
import configparserimport osfrom sqlalchemy import create_engineimport pandas as pdclass DatabaseManager:"""数据库连接管理器""" def __init__(self, config_file='config.ini'): self.config = configparser.ConfigParser()# 读取配置文件if not os.path.exists(config_file): raise FileNotFoundError(f"配置文件不存在: {config_file}") self.config.read(config_file, encoding='utf-8')# 缓存引擎连接 self.engines = {} def get_engine(self, section):"""获取数据库引擎"""if section not in self.engines:if not self.config.has_section(section): raise ValueError(f"配置文件中没有 [{section}] 节")# 构建连接字符串if section.startswith('mysql'): conn_str = ( f"mysql://{self.config[section]['username']}:" f"{self.config[section]['password']}@" f"{self.config[section]['host']}:" f"{self.config[section]['port']}/" f"{self.config[section]['database']}" )elif section.startswith('postgres'): conn_str = ( f"postgresql://{self.config[section]['username']}:" f"{self.config[section]['password']}@" f"{self.config[section]['host']}:" f"{self.config[section]['port']}/" f"{self.config[section]['database']}" )else: raise ValueError(f"不支持的数据库类型: {section}")# 创建引擎 self.engines[section] = create_engine(conn_str)return self.engines[section] def query(self, section, sql, params=None):"""执行查询""" engine = self.get_engine(section)return pd.read_sql(sql, engine, params=params) def close_all(self):"""关闭所有连接"""for engine in self.engines.values(): engine.dispose()# 使用示例db_manager = DatabaseManager()# 从生产数据库查询prod_data = db_manager.query('mysql_prod', "SELECT * FROM sales WHERE date >= '2024-01-01'")# 从分析数据库查询analytics_data = db_manager.query('postgres_analytics',"SELECT * FROM user_behavior")print(f"生产数据行数: {len(prod_data)}")print(f"分析数据行数: {len(analytics_data)}")
4.安全注意事项
虽然INI文件很方便,但安全同样重要:
# 忽略配置文件config.ini*.ini# 但保留示例文件!config.example.ini
结语
掌握了Python连接各种数据库的技能,你就拥有了数据世界的"万能钥匙"。无论是简单的数据查询,还是复杂的数据整合分析,都能游刃有余。
记住:技术不在于复杂,而在于实用。选择最适合你当前需求的技术方案,并不断优化迭代。
希望这篇文章能帮助你在数据处理的路上更进一步!如果有任何问题,欢迎在评论区留言讨论。
代码改变世界,数据驱动未来! 🚀